C# 反序列化父节点以外的子节点';在C中使用XmlSerializer.Deserialize()创建命名空间#

C# 反序列化父节点以外的子节点';在C中使用XmlSerializer.Deserialize()创建命名空间#,c#,xml,serialization,deserialization,C#,Xml,Serialization,Deserialization,我有一个应用程序,它使用名称空间帮助反序列化存储在XML中的对象。XML名称空间也是对象所在的C#名称空间。例如,给定以下XML snip: <xml-config xmlns:app="MyAppNS"> <app:Person> <Name>Bill</Name> <Car> <Make>Honda</Make> <Model>Accord</Mo

我有一个应用程序,它使用名称空间帮助反序列化存储在XML中的对象。XML名称空间也是对象所在的C#名称空间。例如,给定以下XML snip:

<xml-config xmlns:app="MyAppNS">
  <app:Person>
    <Name>Bill</Name>
    <Car>
      <Make>Honda</Make>
      <Model>Accord</Model>
    </Car>
  </app:Person>

  <app:Person>
    <Name>Jane</Name>
    <Car>
      <Make>VW</Make>
      <Model>Jetta</Model>
    </Car>
  </app:Person>

  <app:Car>
    <Make>Audi</Make>
    <Model>A6</Model>
  </app:Car>
</xml-config>
很多人会立即看到这个问题,但是当使用此代码时,生成的
Person
对象是空的,但是没有错误。让反序列化程序填充子元素的唯一方法是为子元素使用相同的命名空间:

  <app:Person>
    <app:Name>Bill</app:Name>
    <app:Car>
      <app:Make>Honda</app:Make>
      <app:Model>Accord</app:Model>
    </app:Car>
  </app:Person>

比尔
本田
一致

我尝试过的另一个选择是使用完全限定的类型名作为元素名(没有名称空间),但是我没有任何运气。有没有办法使反序列化程序接受XML节点的无前缀子节点?

我终于找到了一种方法来完成这项工作,修改找到的答案

我创建了一个自定义反序列化程序,用于复制起始节点的命名空间:

public class CustomXmlNodeReader : XmlNodeReader {

    private String _namespace;

    public CustomXmlNodeReader(XmlNode node) : base(node) {
        _namespace = node.NamespaceURI;
    }

    public override String NamespaceURI {
        get { return _namespace; }
    }
}
使用此读取器,我可以加载具有以下内容的存储对象:

using (XmlNodeReader reader = new CustomXmlNodeReader(node)) {
    obj = serdes.Deserialize(reader);
}

我知道这对于XML来说有点糟糕(强制应用特定的名称空间),但是它非常适合我的需要。此处回答,以防对其他人有所帮助。

仅作为背景,在实际实现中,对象并不总是共享名称空间(即
Person
Car
不一定在同一名称空间中)。这会导致序列化程序和my方法出现问题。您可以在LINQ2XML中执行此操作,而不是反序列化it@Anirudha你能用我提供的示例XML发布一个答案吗?你想从XML中得到什么数据..一个人的集合..我猜还是什么else@Anirudha我需要处理单独反序列化的对象。。。最好在
//TODO
行。当然,任何接近的示例解决方案都会有所帮助。
using (XmlNodeReader reader = new CustomXmlNodeReader(node)) {
    obj = serdes.Deserialize(reader);
}