我正在尝试反序列化简单的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; }
}
因此,当我运行此代码时,我会使用已解析的元数据反序列化同义词库对象,并使用已填充term
和synonym
字段的 1 条目进行反序列化。我无法在这里获得所有条目。
BUT
当我注释掉Synonym
字段时,它开始在同义词库对象中提供 2 条目。我无法在<entries>
标记中包装条目,因为它是我用这个xml文件提供的应用程序的一些内部格式。
任何人都有任何想法如何正确解析这个xml文件?我试着寻找一个解决方案,但是这个xml看起来与示例中的xml完全不同。
答案 0 :(得分:1)
好的,如果您需要保留 synonim 字段数组字段,则需要将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();
}