一千萬個為什麽

搜索

如何將元素反序列化為XmlNode?

在C#中使用Xml序列化時,我想將輸入XML的一部分反序列化為XmlNode。

所以,鑒於這個XML:

<thing Name="George">
  
    
    
  

我想將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"">
  
    
    
  
";
    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元素,但是將其設置為所有無法識別的元素的數組,而不是僅僅一個名為“Document”的元素。 )

最佳答案

嘗試使用[XmlAnyElement]屬性標記Document屬性。

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

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

這將產生一個令人遺憾的副作用,因為你會發現不僅僅是subnode1和subnode2(所有空格也被反序列化...呃),所以你需要將它們過濾掉:

class Program
{
    static void Main()
    {
        const string xml = @"
<thing Name=""George"">
  
    
    
  
";
        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();
    }
}

希望這可以幫助!

轉載註明原文: 如何將元素反序列化為XmlNode?