C# 在C中遍历XML树#
我是.net和c#的新手,所以我想确保我使用的工具适合这份工作 我收到的XML是另一台机器上目录树的描述,所以它有很多层次。我现在需要做的是获取XML并创建对象(自定义类)的结构,并使用XML输入中的信息填充它们,如文件、文件夹、标记、属性 在我看来,这个XML输入的树结构使它成为使用递归遍历树的主要候选者 在.NET3.5中有不同的方法来实现这一点吗 我看过XmlReaders,但它们似乎是以线性方式在树上行走,而不是我真正想要的 我收到的XML是第三方api的一部分,因此不受我的控制,将来可能会发生变化 我已经研究过反序列化,但它的缺点(黑盒实现,需要将成员声明为公共成员,速度慢,仅适用于简单对象…)也将其从列表中删除C# 在C中遍历XML树#,c#,.net,xml,C#,.net,Xml,我是.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之间的区别,我问了一个类似的问题,请按照链接进行讨论: