在C#中遍历XML树

时间:2008-11-14 20:58:06

标签: c# .net xml

我是.net和c#的新手,所以我想确保我正在使用合适的工具。

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

这个XML输入的Tree结构在我看来是使用递归来遍历树的主要候选者。

在.net 3.5中有不同的方法吗?

我看过XmlReaders,但它们似乎是以线性的方式走在树上,而不是我正在寻找的......

我收到的XML是第三方api的一部分,因此不受我的控制,可能会在期货中发生变化。

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

感谢您对此的意见。

4 个答案:

答案 0 :(得分:22)

我会在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"),
    });
}

在示例中, MyFileType 是您为表示文件而创建的类型。这是一种蛮力攻击,但它可以完成任务。

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


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

自1.0天以来,.Net中有许多XML类。这些(主要)在System.Xml中。在.Net 3.5中,在System.Xml.Linq下发布了一组精彩的新XML类。我不能过分强调它们比System.Xml中的旧类更好。我强烈推荐给任何.Net程序员,特别是刚进入.Net / C#的人。

答案 1 :(得分:2)

XmlReader不是一个特别友好的API。如果您可以使用.NET 3.5,那么加载到LINQ to XML可能是您最好的选择。你可以轻松地使用递归。

否则,XmlDocument仍然可以做到这一点......只是不那么愉快。

答案 2 :(得分:2)

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

要详细说明另一张海报所说的内容,您首先需要将XML加载到 System.Xml.XmlDocument 中,(使用 LoadXml 加载)。

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

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

正如Jon所说,XmlReader不是很友好。如果您最终遇到性能问题,您可能需要查看它,但如果您只想完成工作,请使用递归来使用XmlDocument / ChildNodes。

答案 3 :(得分:1)

将XML加载到XMLDocument中。然后,您可以使用递归来遍历XMLDocuments DOM。

您可能还想查看工厂方法模式来创建类,这里非常有用。