Odpowiedzi:
Elementsznajduje tylko te elementy, które są bezpośrednimi potomkami, tj. bezpośrednie dzieci.
Descendants znajduje dzieci na dowolnym poziomie, tj. dzieci, wnuki itp.
Oto przykład pokazujący różnicę:
<?xml version="1.0" encoding="utf-8" ?>
<foo>
<bar>Test 1</bar>
<baz>
<bar>Test 2</bar>
</baz>
<bar>Test 3</bar>
</foo>
Kod:
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);
}
Wynik:
Elementy: Test 1 Elementy: test 3 Potomkowie: test 1 Potomkowie: test 2 Potomkowie: test 3
Jeśli wiesz, że elementy, które chcesz, są bezpośrednimi dziećmi, uzyskasz lepszą wydajność, jeśli użyjesz Elementszamiast Descendants.
Descendantsprzeszuka całe poddrzewo bieżącego elementu pod kątem określonej nazwy (lub zwróci spłaszczoną wersję drzewa, jeśli nie zostanie podana nazwa), podczas gdy Elementsprzeszukuje tylko bezpośrednie elementy potomne bieżącego elementu.