如何将元素反序列化为XmlNode?

mac*_*nir 10 c# xml xml-serialization

在C#中使用Xml序列化时,我想将输入XML的一部分反序列化为XmlNode.

所以,鉴于这个XML:

<Thing Name="George">
  <Document>
    <subnode1/>
    <subnode2/>
  </Document>
</Thing>
Run Code Online (Sandbox Code Playgroud)

我想将Document元素反序列化为XmlNode.

下面是我给出上面的XML的尝试,将Document设置为'subnode1'元素而不是'Document'元素.

如何获取将Document属性设置为Document元素的代码?

using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

[Serializable]
public class Thing
{
  [XmlAttribute] public string Name {get;set;}
  public XmlNode Document { get; set; }
}

class Program
{
  static void Main()
  {
    const string xml = @"
<Thing Name=""George"">
  <Document>
    <subnode1/>
    <subnode2/>
  </Document>
</Thing>";
    var s = new XmlSerializer(typeof(Thing));
    var thing = s.Deserialize(new StringReader(xml)) as Thing;
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我使用XmlSerializer将上面的XML反序列化为Thing实例时,Document属性包含子元素'subnode1',而不是'Document'元素.

如何让XmlSerializer将Document设置为包含'Document'元素的XmlNode?

(注意:我可以通过指定XmlElement []类型的属性并将其标记为[XmlAnyElement]来获取Document元素,但是将其设置为所有无法识别的元素的数组,而不是仅仅一个名为"Document"的元素.

cod*_*ife 10

尝试使用[XmlAnyElement]属性标记Document属性.

[Serializable]
public class Thing
{
    [XmlAttribute] 
    public string Name {get;set;}

    [XmlAnyElement]
    public XmlNode Document { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这将产生一个不幸的副作用,因为你会发现不仅仅是subnode1和subnode2(所有的空格也被反序列化...呃),所以你需要将它们过滤掉:

class Program
{
    static void Main()
    {
        const string xml = @"
<Thing Name=""George"">
  <Document>
    <subnode1/>
    <subnode2/>
  </Document>
</Thing>";
        var s = new XmlSerializer(typeof(Thing));
        var thing = s.Deserialize(new StringReader(xml)) as Thing; 

        foreach (XmlNode node in thing.Document)
        {
            // should filter to only subnode1 and subnode2.
            if (node.Name != "" && node.Name != "#whitespace")
            {
              Console.WriteLine(node.Name);
            }
        }

        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!