当使用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; }
}

当使用c#中内置的xml反序列化从外部api反序列化xml时,重复的值

最简单的方法可能是在反序列化之前通过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,如果你喜欢

相关文章: