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

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.


Ś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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.