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

时间:2011-05-04 03:03:09

标签: c# asp.net xml xml-serialization

我正在使用内置的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; }
}

即使xml有效,由于名称重复而在调用(T)xmlserializer.Deserialize(stream)时抛出错误。就个人而言,我不会在对象中复制xml布局时只是为了在手动反序列化时更容易反序列化(特别是当它从未被.net首先序列化时)。

但是,我想知道是否有一种方法可以解决这个问题,即使这意味着将子对象展平。

我知道这不起作用,但作为例子:

[XmlType("person")]
public class Person {

  [XmlElement("id")]
  public int Id { get; set; }

  [XmlElement("person/name")]
  public string Title{ get; set; }
}

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

最简单的方法可能是在反序列化之前通过XSLT转换运行它 - 匹配person / person / name元素并仅输出person / name部分。然后反序列化结果。

这是关于在C#中应用XSLT的SO帖子:How to apply an XSLT Stylesheet in C#

以下是使用XSLT替换元素的问题:http://cvalcarcel.wordpress.com/2008/09/06/replacing-arbitrary-xml-located-within-an-xml-document-using-xslt/

答案 1 :(得分:0)

在最糟糕的情况下,你可以编写你喜欢的类(不要因为序列化而妥协),然后实现IXmlSerializable。实现ReadXml,如果愿意,可以为WriteXml抛出NotImplementedException。