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

C# 在C中使用内置的xml反序列化从外部api反序列化xml时重复值#,c#,asp.net,xml,xml-serialization,C#,Asp.net,Xml,Xml Serialization,我使用内置的XML反序列化(不是因为这是我的选择,而是遗留代码)将XML反序列化为强类型对象 注意:我无法控制xml,它是一个外部api 问题是xml节点已扩展为包含同名的子节点,并且破坏了序列化 例如,xml格式如下所示: <people> <person> <id>1234</id> <person> <name>This is my name</name> <p

我使用内置的XML反序列化(不是因为这是我的选择,而是遗留代码)将XML反序列化为强类型对象

注意:我无法控制xml,它是一个外部api

问题是xml节点已扩展为包含同名的子节点,并且破坏了序列化

例如,xml格式如下所示:

<people>
  <person>
    <id>1234</id>
    <person>
      <name>This is my name</name>
    <person>
   </person>
</people>
这在调用(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; }
}

非常感谢您的帮助。

在最坏的情况下,您可以随心所欲地编写类(不要因为序列化而妥协),然后实现IXmlSerializable。实现ReadXml,如果愿意,为WriteXml抛出NotImplementedException。

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

下面是一篇关于在C#中应用XSLT的文章:


这里有一个关于使用XSLT替换元素的例子:

它是为了匹配发送给我们的xml而编写的。问题是XmlSerializer不喜欢父元素和子元素共享相同的XmlElement“person”。只是想知道是否有比重写解析更快的解决方法。这是一个非常复杂的rest接口,需要几天的工作才能重写。好吧,所以真的没有办法绕过反序列化程序,坚持子元素的名称要唯一地命名给它们的父元素吗?也许可以,尽管我怀疑,向person类添加一个Name属性和一个适当属性的NestedPerson属性,并使所有属性在语义上都是可选的。这可能会欺骗XmlSerializer创建一个具有所有其他属性的外部person实例,并在其NestedPerson属性中创建另一个仅具有name属性集的person实例。但这似乎比XSLT预处理器更像是一种黑客行为。谢谢您的输入。我将把它放长一点,因为我的现实世界中有一个完整的对象库,其中反序列化完全由注释运行。如果我对实际的服务呼叫干预太多,我将有很多东西需要重新测试。再说一次,我自己也不会这样做的,但我现在还在坚持。如果我没有得到任何更快的修复,我会标记为答案。。。再次感谢!
[XmlType("person")]
public class Person {

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

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