在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? p>
(注意:我可以通过指定XmlElement []类型的属性并将其标记为[XmlAnyElement]来获取Document元素,但是将其设置为所有无法识别的元素的数组,而不仅仅是一个名为'文档')
答案 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();
}
}
希望这有帮助!