Query an XDocument for elements by name at any depth Query an XDocument for elements by name at any depth xml xml

Query an XDocument for elements by name at any depth


Descendants should work absolutely fine. Here's an example:

using System;using System.Xml.Linq;class Test{    static void Main()    {        string xml = @"<root>  <child id='1'/>  <child id='2'>    <grandchild id='3' />    <grandchild id='4' />  </child></root>";        XDocument doc = XDocument.Parse(xml);        foreach (XElement element in doc.Descendants("grandchild"))        {            Console.WriteLine(element);        }    }}

Results:

<grandchild id="3" />
<grandchild id="4" />


An example indicating the namespace:

String TheDocumentContent =@"<TheNamespace:root xmlns:TheNamespace = 'http://www.w3.org/2001/XMLSchema' >   <TheNamespace:GrandParent>      <TheNamespace:Parent>         <TheNamespace:Child theName = 'Fred'  />         <TheNamespace:Child theName = 'Gabi'  />         <TheNamespace:Child theName = 'George'/>         <TheNamespace:Child theName = 'Grace' />         <TheNamespace:Child theName = 'Sam'   />      </TheNamespace:Parent>   </TheNamespace:GrandParent></TheNamespace:root>";XDocument TheDocument = XDocument.Parse( TheDocumentContent );//Example 1:var TheElements1 =from    AnyElementin    TheDocument.Descendants( "{http://www.w3.org/2001/XMLSchema}Child" )select    AnyElement;ResultsTxt.AppendText( TheElements1.Count().ToString() );//Example 2:var TheElements2 =from    AnyElementin    TheDocument.Descendants( "{http://www.w3.org/2001/XMLSchema}Child" )where    AnyElement.Attribute( "theName" ).Value.StartsWith( "G" )select    AnyElement;foreach ( XElement CurrentElement in TheElements2 ){    ResultsTxt.AppendText( "\r\n" + CurrentElement.Attribute( "theName" ).Value );}


You can do it this way:

xml.Descendants().Where(p => p.Name.LocalName == "Name of the node to find")

where xml is a XDocument.

Be aware that the property Name returns an object that has a LocalName and a Namespace. That's why you have to use Name.LocalName if you want to compare by name.