What is the difference between Linq to XML Descendants and Elements What is the difference between Linq to XML Descendants and Elements xml xml

What is the difference between Linq to XML Descendants and Elements


Elements finds only those elements that are direct descendents, i.e. immediate children.

Descendants finds children at any level, i.e. children, grand-children, etc...


Here is an example demonstrating the difference:

<?xml version="1.0" encoding="utf-8" ?><foo>    <bar>Test 1</bar>    <baz>        <bar>Test 2</bar>    </baz>    <bar>Test 3</bar></foo>

Code:

XDocument doc = XDocument.Load("input.xml");XElement root = doc.Root;foreach (XElement e in root.Elements("bar")){    Console.WriteLine("Elements : " + e.Value);}foreach (XElement e in root.Descendants("bar")){    Console.WriteLine("Descendants : " + e.Value);}

Result:

Elements : Test 1Elements : Test 3Descendants : Test 1Descendants : Test 2Descendants : Test 3

If you know that the elements you want are immediate children then you will get better performance if you use Elements instead of Descendants.


Descendants will search the entire subtree of the current element for the specified name (or will return a flattened version of the tree if no name is provided), whereas Elements searches only the immediate children of the current element.