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.