C#:获取XML doc的所有节点

Nic*_*lai 12 c# xml

有一个简单的方法,从xml文档中获取所有节点吗?我需要每个节点,childnode等,以检查它们是否具有某些属性.

或者我是否必须抓取文档,询问子节点?

Jon*_*eet 23

在LINQ to XML中,它非常简单:

XDocument doc = XDocument.Load("test.xml"); // Or whatever
var allElements = doc.Descendants();
Run Code Online (Sandbox Code Playgroud)

因此,要查找具有特定属性的所有元素,例如:

var matchingElements = doc.Descendants()
                          .Where(x => x.Attribute("foo") != null);
Run Code Online (Sandbox Code Playgroud)

这是假设你想要所有元素.如果您想要所有节点(包括文本节点等,但包括属性作为单独的节点),您可以使用它DescendantNodes().

编辑:LINQ to XML中的命名空间很不错.你用的是:

var matchingElements = doc.Descendants()
                          .Where(x => x.Attribute(XNamespace.Xmlns + "aml") != null);
Run Code Online (Sandbox Code Playgroud)

或者用于不同的命名空间:

XNamespace ns = "http://some.namespace.uri";

var matchingElements = doc.Descendants()
                          .Where(x => x.Attribute(ns + "foo") != null);
Run Code Online (Sandbox Code Playgroud)


Dav*_*ras 7

请参阅此处:迭代XML文件中的所有节点

不久:

 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)

  • 与XDocument和其他类似DOM的方法相比,此方法通常非常非常快。 (2认同)

Bud*_*rot 7

在我看来,最简单的解决方案是使用 XPath。如果您有 .NET 2,这也有效:

var testDoc = new XmlDocument();
testDoc.LoadXml(str);
var tmp = testDoc.SelectNodes("//*"); // match every element
Run Code Online (Sandbox Code Playgroud)

  • 按属性名称获取所有节点: var pnNodes = testDoc.SelectNodes("//*[@AttributeName]"); (2认同)