迭代XML文件中的所有节点

Nig*_*ker 32 c# xml

我想迭代XML文件中的所有节点并打印它们的名称.做这个的最好方式是什么?我使用的是.NET 2.0.

Inc*_*ito 45

您可以使用XmlDocument.一些XPath也很有用.

只是一个简单的例子

XmlDocument doc = new XmlDocument();
doc.Load("sample.xml");
XmlElement root = doc.DocumentElement;
XmlNodeList nodes = root.SelectNodes("some_node"); // You can also use XPath here
foreach (XmlNode node in nodes)
{
   // use node variable here for your beeds
}
Run Code Online (Sandbox Code Playgroud)

  • 更喜欢这个,因为与使用 XmlReader 相比,它将开始/结束元素和内容视为单个项目 (2认同)

Chr*_*lor 36

我认为最快最简单的方法是使用XmlReader,这不需要任何递归和最小内存占用.

这是一个简单的例子,对于紧凑性我只使用了一个简单的字符串,当然你可以使用文件中的流等.

  string xml = @"
    <parent>
      <child>
        <nested />
      </child>
      <child>
        <other>
        </other>
      </child>
    </parent>
    ";

  XmlReader rdr = XmlReader.Create(new System.IO.StringReader(xml));
  while (rdr.Read())
  {
    if (rdr.NodeType == XmlNodeType.Element)
    {
      Console.WriteLine(rdr.LocalName);
    }
  }
Run Code Online (Sandbox Code Playgroud)

以上结果将是

parent
child
nested
child
other
Run Code Online (Sandbox Code Playgroud)

XML文档中所有元素的列表.


Uwe*_*eim 16

这就是我自己为自己写的:

public static class XmlDocumentExtensions
{
    public static void IterateThroughAllNodes(
        this XmlDocument doc, 
        Action<XmlNode> elementVisitor)
    {
        if (doc != null && elementVisitor != null)
        {
            foreach (XmlNode node in doc.ChildNodes)
            {
                doIterateNode(node, elementVisitor);
            }
        }
    }

    private static void doIterateNode(
        XmlNode node, 
        Action<XmlNode> elementVisitor)
    {
        elementVisitor(node);

        foreach (XmlNode childNode in node.ChildNodes)
        {
            doIterateNode(childNode, elementVisitor);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用它,我使用过类似的东西:

var doc = new XmlDocument();
doc.Load(somePath);

doc.IterateThroughAllNodes(
    delegate(XmlNode node)
    {
        // ...Do something with the node...
    });
Run Code Online (Sandbox Code Playgroud)

也许它可以帮助那里的人.

  • 这很棒!通过逐步完成此代码我学到了很多,感谢分享. (2认同)
  • 通用方法。+1 我更喜欢这个。 (2认同)

tcb*_*tcb 5

遍历所有元素

XDocument xdoc = XDocument.Load("input.xml");
foreach (XElement element in xdoc.Descendants())
{
    Console.WriteLine(element.Name);
}
Run Code Online (Sandbox Code Playgroud)