mac*_*nir 10 c# xml xml-serialization
在C#中使用Xml序列化时,我想将输入XML的一部分反序列化为XmlNode.
所以,鉴于这个XML:
<Thing Name="George">
<Document>
<subnode1/>
<subnode2/>
</Document>
</Thing>
Run Code Online (Sandbox Code Playgroud)
我想将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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我使用XmlSerializer将上面的XML反序列化为Thing实例时,Document属性包含子元素'subnode1',而不是'Document'元素.
如何让XmlSerializer将Document设置为包含'Document'元素的XmlNode?
(注意:我可以通过指定XmlElement []类型的属性并将其标记为[XmlAnyElement]来获取Document元素,但是将其设置为所有无法识别的元素的数组,而不是仅仅一个名为"Document"的元素.
cod*_*ife 10
尝试使用[XmlAnyElement]属性标记Document属性.
[Serializable]
public class Thing
{
[XmlAttribute]
public string Name {get;set;}
[XmlAnyElement]
public XmlNode Document { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这将产生一个不幸的副作用,因为你会发现不仅仅是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();
}
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
9925 次 |
| 最近记录: |