How to filter on element names (LINQ to XML)

When you call one of the methods that return IEnumerable<T> of XElement, you can filter on the element name.

Example: Retrieve descendants filtered to a specified name

This example retrieves a collection of descendants that's filtered to contain only descendants with the specified name.

This example uses XML document Sample XML file: Typical purchase order.

XElement po = XElement.Load("PurchaseOrder.xml");
IEnumerable<XElement> items =
    from el in po.Descendants("ProductName")
    select el;
foreach(XElement prdName in items)
    Console.WriteLine(prdName.Name + ":" + (string) prdName);
Dim po As XElement = XElement.Load("PurchaseOrder.xml")
Dim items As IEnumerable(Of XElement) = _
    From el In po...<ProductName> _
    Select el
For Each prdName As XElement In items
    Console.WriteLine(prdName.Name.ToString & ":" & prdName.Value)
Next

This example produces the following output:

ProductName:Lawnmower
ProductName:Baby Monitor

The other methods that return IEnumerable<T> of XElement collections follow the same pattern. Their signatures are similar to Elements and Descendants. The following is the complete list of methods that have similar method signatures:

Example: Retrieve from XML that's in a namespace

The following example shows the same query for XML that's in a namespace. For more information, see Namespaces overview.

The example uses XML document Sample XML file: Typical purchase order in a namespace.

XNamespace aw = "http://www.adventure-works.com";
XElement po = XElement.Load("PurchaseOrderInNamespace.xml");
IEnumerable<XElement> items =
    from el in po.Descendants(aw + "ProductName")
    select el;
foreach (XElement prdName in items)
    Console.WriteLine(prdName.Name + ":" + (string)prdName);
Imports <xmlns:aw="http://www.adventure-works.com">

Module Module1
    Sub Main()
        Dim po As XElement = XElement.Load("PurchaseOrderInNamespace.xml")
        Dim items As IEnumerable(Of XElement) = _
            From el In po...<aw:ProductName> _
            Select el
        For Each prdName As XElement In items
            Console.WriteLine(prdName.Name.ToString & ":" & prdName.Value)
        Next
    End Sub
End Module

This example produces the following output:

{http://www.adventure-works.com}ProductName:Lawnmower
{http://www.adventure-works.com}ProductName:Baby Monitor

See also