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

时间:2010-04-19 10:08:47

标签: c# xml xml-serialization

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

所以,鉴于这个XML:

<Thing Name="George">
  <Document>
    <subnode1/>
    <subnode2/>
  </Document>
</Thing>

我想将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;
  }
}

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

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

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

1 个答案:

答案 0 :(得分:10)

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

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

    [XmlAnyElement]
    public XmlNode Document { get; set; }
}

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

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();
    }
}

希望这有帮助!