【问题标题】:Walking an XML tree in C#在 C# 中遍历 XML 树
【发布时间】:2008-11-14 20:58:05
【问题描述】:

我是 .net 和 c# 的新手,所以我想确保我使用正确的工具来完成这项工作。

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

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

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

我查看了 XmlReaders,但它们似乎以线性方式遍历树,而不是我真正想要的...

我收到的 XML 是第 3 方 api 的一部分,因此不在我的控制范围内,并且可能会在未来发生变化。

我研究了反序列化,但它的缺点(黑盒实现,需要将成员声明为公共,速度慢,仅适用于简单对象...)也将其排除在列表之外。

感谢您对此的意见。

【问题讨论】:

标签: c# .net xml


【解决方案1】:

我将使用 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 用于强调 System.Xml 和 System.Xml.Linq 之间的区别。
【解决方案2】:

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

否则,XmlDocument 仍然可以解决问题……只是不那么令人愉快。

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-09-12
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多