Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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# 在C中遍历XML树#_C#_.net_Xml - Fatal编程技术网

C# 在C中遍历XML树#

C# 在C中遍历XML树#,c#,.net,xml,C#,.net,Xml,我是.net和c#的新手,所以我想确保我使用的工具适合这份工作 我收到的XML是另一台机器上目录树的描述,所以它有很多层次。我现在需要做的是获取XML并创建对象(自定义类)的结构,并使用XML输入中的信息填充它们,如文件、文件夹、标记、属性 在我看来,这个XML输入的树结构使它成为使用递归遍历树的主要候选者 在.NET3.5中有不同的方法来实现这一点吗 我看过XmlReaders,但它们似乎是以线性方式在树上行走,而不是我真正想要的 我收到的XML是第三方api的一部分,因此不受我的控制,将来可

我是.net和c#的新手,所以我想确保我使用的工具适合这份工作

我收到的XML是另一台机器上目录树的描述,所以它有很多层次。我现在需要做的是获取XML并创建对象(自定义类)的结构,并使用XML输入中的信息填充它们,如文件、文件夹、标记、属性

在我看来,这个XML输入的树结构使它成为使用递归遍历树的主要候选者

在.NET3.5中有不同的方法来实现这一点吗

我看过XmlReaders,但它们似乎是以线性方式在树上行走,而不是我真正想要的

我收到的XML是第三方api的一部分,因此不受我的控制,将来可能会发生变化

我已经研究过反序列化,但它的缺点(黑盒实现,需要将成员声明为公共成员,速度慢,仅适用于简单对象…)也将其从列表中删除


感谢您的输入。

将您的XML加载到XML文档中。然后可以使用递归遍历XMLDOM文档


您可能还需要研究工厂方法模式来创建类,这在这里非常有用。

XmlReader不是一个特别友好的API。如果您可以使用.NET3.5,那么加载到LINQtoXML可能是您的最佳选择。您可以很容易地使用递归


否则,XmlDocument仍然会起作用。。。稍微不那么愉快。

我将使用System.Xml.Linq中的XLINQ类(这是您需要引用的名称空间和程序集)。将XML加载到和XDocument中:

XDocument doc = XDocument.Parse(someString);
接下来,您可以使用递归或伪递归循环来迭代子节点。您可以选择子节点,如:

//if Directory is tag name of Directory XML
//Note: Root is just the root XElement of the document
var directoryElements = doc.Root.Elements("Directory"); 

//you get the idea
var fileElements = doc.Root.Elements("File"); 
变量directoryElements和fileElements将是IEnumerable类型,这意味着您可以使用类似于foreach的东西来循环所有元素。构建元素的一种方法如下:

List<MyFileType> files = new List<MyFileType>();

foreach(XElelement fileElement in fileElements)
{
  files.Add(new MyFileType()
    {     
      Prop1 = fileElement.Element("Prop1"), //assumes properties are elements
      Prop2 = fileElement.Element("Prop2"),
    });
}
List files=newlist();
foreach(fileElement中的xelement fileElement)
{
添加(新的MyFileType()
{     
Prop1=fileElement.Element(“Prop1”),//假定属性是元素
Prop2=fileElement.Element(“Prop2”),
});
}
在本例中,MyFileType是您为表示文件而创建的类型。这是一种蛮力攻击,但它会完成任务

如果要使用XPath,则需要使用System.Xml.XPath


关于System.Xml与System.Xml.Linq的说明


自1.0以来,.Net中已经存在许多XML类。它们(主要)存在于System.Xml中。在.NET3.5中,在System.XML.Linq下发布了一组出色的新XML类。与System.Xml中的旧类相比,我再强调也不过分。我强烈推荐给任何.Net程序员,尤其是刚刚进入.Net/C的人

这是一个非常适合递归的问题

为了更详细地阐述另一张海报所说的内容,您需要首先将XML加载到System.XML.XML文档中(使用LoadXml或Load)

您可以使用XmlDocument.DocumentElement属性访问树的根,并使用ChildNodes属性访问每个节点的子节点。子节点返回一个集合,当集合的大小为0时,您就知道已经达到了基本情况

使用LINQ也是一个不错的选择,但我无法详细说明这个解决方案,因为我不是一个真正的LINQ专家


正如Jon提到的,XmlReader不是很友好。如果您最终遇到性能问题,您可能希望对此进行研究,但如果您只是想完成这项工作,请使用递归的XmlDocument/ChildNodes

+1为了强调System.Xml和System.Xml.Linq之间的区别,我问了一个类似的问题,请按照链接进行讨论: