C# 如何将元素反序列化为XmlNode?
在C#中使用Xml序列化时,我希望将输入Xml的一部分反序列化到XmlNode 因此,考虑到这种XML:C# 如何将元素反序列化为XmlNode?,c#,xml,xml-serialization,C#,Xml,Xml Serialization,在C#中使用Xml序列化时,我希望将输入Xml的一部分反序列化到XmlNode 因此,考虑到这种XML: <Thing Name="George"> <Document> <subnode1/> <subnode2/> </Document> </Thing> 我想将Document元素反序列化为XmlNode 下面是我的尝试,在给定上述XML的情况下,将文档设置为“subnode1”元素,而不
<Thing Name="George">
<Document>
<subnode1/>
<subnode2/>
</Document>
</Thing>
我想将Document元素反序列化为XmlNode
下面是我的尝试,在给定上述XML的情况下,将文档设置为“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;
}
}
使用系统;
使用System.IO;
使用System.Xml;
使用System.Xml.Serialization;
[可序列化]
公共类事物
{
[XmlAttribute]公共字符串名称{get;set;}
公共XmlNode文档{get;set;}
}
班级计划
{
静态void Main()
{
常量字符串xml=@“
";
var s=新的XmlSerializer(typeof(Thing));
var thing=s.反序列化(新的StringReader(xml))为thing;
}
}
但是,当我使用XmlSerializer将上面的XML反序列化为一个实例时,Document属性包含子元素“subnode1”,而不是“Document”元素
如何让XmlSerializer将文档设置为包含“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"">
<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();
}
}
类程序
{
静态void Main()
{
常量字符串xml=@“
";
var s=新的XmlSerializer(typeof(Thing));
var thing=s.反序列化(新的StringReader(xml))为thing;
foreach(thing.Document中的XmlNode节点)
{
//应仅过滤到子节点1和子节点2。
if(node.Name!=”&&node.Name!=“#空格”)
{
Console.WriteLine(node.Name);
}
}
Console.ReadLine();
}
}
希望这有帮助 嗯,那是个难题!DataContractSerializer也表现出相同的行为。结构是否始终是Document/subnode1、Document/subnode2,还是会有subnode3、subnode4等?如果是这样,您是否愿意将架构修改为Document/subnode(subnode minOccurs=0,maxOccurs=unbounded)?文档的内容完全是自由形式的,这里只是一个示例,演示了反序列化程序如何选择文档的第一个子节点。在问题的底部,我提到了一个解决方法是使用XmlAnyElement属性,但我不知道它可以放在单个XmlNode上。也许你在我添加文本之前就回答了。不过,我更喜欢捕获所有未识别的元素,这样我就可以检测XML中的错误(即应该只有一个子元素)。