使用内部数组反序列化 xml
本文关键字:反序列化 xml 数组 内部 | 更新日期: 2023-09-27 18:37:18
>我正在尝试反序列化简单的xml文件:
<thesaurus xmlns="http://marklogic.com/xdmp/thesaurus">
<metadata>
</metadata>
<entry>
<term>a</term>
<synonym>
<term>as</term>
</synonym>
</entry>
<entry>
<term>b</term>
<synonym>
<term>bs</term>
</synonym>
<synonym>
<term>bss</term>
</synonym>
</entry>
</thesaurus>
我像这样使用XmlSerializer:
var xmlSerializer = new XmlSerializer(typeof(Thesaurus));
var thesaurus = xmlSerializer.Deserialize(stream);
我的模型如下所示:
[Serializable]
[XmlRoot("thesaurus", Namespace = "http://marklogic.com/xdmp/thesaurus")]
public class Thesaurus
{
[XmlElement("metadata")]
public Metadata Metadata { get; set; }
[XmlElement("entry")]
public List<Entry> Entries { get; set; }
}
public class Metadata
{
}
public class Entry
{
[XmlElement("term")]
public string Term { get; set; }
[XmlElement("synonym")]
public String[] Synonym { get; set; }
}
因此,当我运行此代码时,我得到了反序列化的同义词库对象,其中包含解析的元数据和 1 个带有填充term
和synonym
字段的条目。我无法在这里获得所有条目。
但
当我注释掉Synonym
字段时,它开始在同义词库对象中给我 2 个条目。我无法将条目包装在 <entries>
标记中,因为它是我使用此 xml 文件馈送的应用程序的某种内部格式。
有人知道如何正确解析此xml文件吗?我尝试搜索解决方案,但此 xml 看起来与示例中的 xml 完全不同。
好的,所以如果你需要保留术语字段的同义词字段数组,你需要将你的 Entry 类更改为这样的内容:
public class Entry
{
[XmlElement("term")]
public string Term { get; set; }
[XmlElement("synonim")]
public Term[] Synonym { get; set; }
}
您还需要添加其他一个:
public class Term
{
[XmlElement("term")]
public string Value { get; set; }
}
这样你就会得到你需要的东西。因此,附加类添加了额外的层次结构级别。
请在下面找到以下代码进行测试:
var xmlSerializer = new XmlSerializer(typeof(Thesaurus));
var r = new Thesaurus();
r.Entries = new List<Entry>();
r.Metadata = new Metadata();
r.Entries.Add(new Entry()
{
Synonym = new Term[] { new Term(){Value = "1"}, new Term() {Value = "2"}, },
Term = "Term1"
});
r.Entries.Add(new Entry()
{
Synonym = new Term[] { new Term() { Value = "3" }, new Term() { Value = "4" }, },
Term = "Term2"
});
using (TextWriter writer = new StreamWriter(@"c:'111.xml"))
{
xmlSerializer.Serialize(writer, r);
writer.Close();
}
using (TextReader reader = new StreamReader(@"c:'111.xml"))
{
Thesaurus tt = xmlSerializer.Deserialize(reader) as Thesaurus;
Console.Write(tt.Entries.Count);
reader.Close();
}