我试图反序列化简单的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非常不同。
发布于 2016-03-03 08:25:18
好的,如果您需要保留在synonim字段数组中的术语字段,则需要将条目类更改为如下所示:
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();
}https://stackoverflow.com/questions/35765906
复制相似问题