gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:08:32 25 4
gpt4 key购买 nike

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

所以,给定这个 XML:

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

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

下面是我的尝试,给定上面的 XML,将文档设置为“subnode1”元素而不是“文档”元素。

我如何获得将 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 元素,但它被设置为所有无法识别的元素的数组,而不仅仅是一个名为'文档')

最佳答案

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

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

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

这会产生一个不幸的副作用,因为您会发现不仅仅是子节点 1 和子节点 2(所有 空格 也会被反序列化...呃),因此您需要将它们过滤掉:

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

希望这对您有所帮助!

关于c# - 如何将元素反序列化为 XmlNode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2666494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com