当使用c#中内置的xml反序列化从外部api反序列化xml时,重复的值
本文关键字:反序列化 xml api 从外部 内置 | 更新日期: 2023-09-27 17:54:27
我使用内置的XML反序列化(不是因为我的选择,而是遗留代码)将XML反序列化为强类型对象。
注意:我无法控制xml,它是一个外部api
问题是xml节点已经扩展到包含同名的子节点,并且它破坏了序列化。
例如,xml格式如下:
<people>
<person>
<id>1234</id>
<person>
<name>This is my name</name>
<person>
</person>
</people>
使用下列对象
[XmlType("person")]
public class Person {
[XmlElement("id")]
public int Id { get; set; }
[XmlElement("person")]
public PersonTitle Title{ get; set; }
}
[XmlType("person")]
pulic class PersonTitle
{
[XmlElement("name")]
public string Name { get; set; }
}
调用(T)xmlserializer.Deserialize(stream)时抛出错误,尽管xml是有效的,但由于名称重复。就我个人而言,当手动反序列化更容易维护时,我不会麻烦地在对象中复制xml布局来自动反序列化它(特别是当它从一开始就没有被。net序列化时)。
然而,我想知道是否有一种方法可以解决这个问题,即使这意味着将子对象扁平化。
我知道这行不通,但是作为一个例子:
[XmlType("person")]
public class Person {
[XmlElement("id")]
public int Id { get; set; }
[XmlElement("person/name")]
public string Title{ get; set; }
}
最简单的方法可能是在反序列化之前通过XSLT转换运行它—匹配person/person/name元素并只输出person/name部分。然后反序列化结果。
这是一篇关于在c#中应用XSLT的文章:如何在c#中应用XSLT样式表
下面是关于使用XSLT替换元素的示例:http://cvalcarcel.wordpress.com/2008/09/06/replacing-arbitrary-xml-located-within-an-xml-document-using-xslt/
在最坏的情况下,您可以按照自己喜欢的方式编写类(不要因为序列化而妥协),然后实现IXmlSerializable。实现ReadXml,抛出NotImplementedException为WriteXml,如果你喜欢