Jaka jest różnica między Linq a potomkami XML i elementami

181

Oba te słowa kluczowe natrafiłem na VS IntelliSense. Próbowałem googlować różnicę między nimi i nie otrzymałem jasnej odpowiedzi. Który z nich ma najlepszą wydajność z małymi lub średnimi plikami XML. Dzięki

Luke101
źródło

Odpowiedzi:

292

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.

Mark Byers
źródło
Świetna odpowiedź, zawsze myślałem, że obie były trochę wstecz, jak podkreślono w twoim opisie (opisując elementy, zawsze musisz używać słowa „potomek”, ponieważ jest ono bardziej opcjonalne, gdy mówimy o potomkach
Mattisdada
16

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.

Adam Robinson
źródło