This topic has not yet been rated - Rate this topic

XContainer.Descendants Method (XName)

Returns a filtered collection of the descendant elements for this document or element, in document order. Only elements that have a matching XName are included in the collection.

Namespace:  System.Xml.Linq
Assembly:  System.Xml.Linq (in System.Xml.Linq.dll)
public IEnumerable<XElement> Descendants(
	XName name
)

Parameters

name
Type: System.Xml.Linq.XName
The XName to match.

Return Value

Type: System.Collections.Generic.IEnumerable<XElement>
An IEnumerable<T> of XElement containing the descendant elements of the XContainer that match the specified XName.

This method uses deferred execution.

The following example prints all descendants of an element.

// Attributes are not nodes, so will not be returned by DescendantNodes.
XElement xmlTree = new XElement("Root",
    new XAttribute("Att1", "AttributeContent"),
    new XElement("Child",
        new XText("Some text"),
        new XElement("GrandChild", "element content")
    )
);
IEnumerable<XElement> de =
    from el in xmlTree.Descendants("Child")
    select el;
foreach (XElement el in de)
    Console.WriteLine(el.Name);

This example produces the following output:

Child

The following is the same example, but in this case the XML is in a namespace. For more information, see Working with XML Namespaces.

// Attributes are not nodes, so will not be returned by DescendantNodes.
XNamespace aw = "http://www.adventure-works.com";
XElement xmlTree = new XElement(aw + "Root",
    new XAttribute(aw + "Att1", "AttributeContent"),
    new XElement(aw + "Child",
        new XText("Some text"),
        new XElement(aw + "GrandChild", "element content")
    )
);
IEnumerable<XElement> de =
    from el in xmlTree.Descendants(aw + "Child")
    select el;
foreach (XElement el in de)
    Console.WriteLine(el.Name);

This example produces the following output:

{http://www.adventure-works.com}Child

.NET Framework

Supported in: 4, 3.5

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
Did you find this helpful?
(1500 characters remaining)
Community Content Add
Annotations FAQ
Namespaces
There is no need to manipulate strings like the above comment. You can use the overridden + operator of XNamespace.

XNamespace ns = "http://example.org";
var elements = xml.Descendants(ns + "element");
Needs a fully-qualified name

When you use a proper XML file with namespaces with this API, you will never return anything with Descendents("ElementName") because it needs a fully-qualified name.

The format {namespace}localName is used for a fully-qualified XName.

 

The ':' character, hexadecimal value 0x3A, cannot be included in a name.

Conversely, you might be tempted to cache the default namespace and append it onto your element names, but be warned that the .GetDefaultNamespace() method returns the string without the {outer braces} required to be immediately re-used in the API.

A useful extension method for all this is:
        public static XName XNameFor(this XElement element, string elementName)
        {
            return String.Concat("{", element.GetDefaultNamespace(), "}", elementName);
        }