Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将元素反序列化为XmlNode?_C#_Xml_Xml Serialization - Fatal编程技术网

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

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”元素,而不

在C#中使用Xml序列化时,我希望将输入Xml的一部分反序列化到XmlNode

因此,考虑到这种XML:

<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中的错误(即应该只有一个子元素)。