Was ist der Unterschied zwischen Linq- und XML-Nachkommen und -Elementen?

181

Ich bin auf beide Schlüsselwörter in VS IntelliSense gestoßen. Ich habe versucht, den Unterschied zwischen ihnen zu googeln und bekam keine klare Antwort. Welche davon haben die beste Leistung mit kleinen bis mittleren XML-Dateien. Vielen Dank

Luke101
quelle

Antworten:

292

Elementsfindet nur die Elemente, die direkte Nachkommen sind, dh unmittelbare Kinder.

Descendants findet Kinder auf jeder Ebene, dh Kinder, Enkelkinder, etc ...


Hier ist ein Beispiel, das den Unterschied zeigt:

<?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);
}

Ergebnis:

Elemente: Test 1
Elemente: Test 3
Nachkommen: Test 1
Nachkommen: Test 2
Nachkommen: Test 3

Wenn Sie wissen, dass die gewünschten Elemente unmittelbare untergeordnete Elemente sind, erhalten Sie eine bessere Leistung, wenn Sie Elementsstattdessen verwenden Descendants.

Mark Byers
quelle
Tolle Antwort, ich dachte immer, die beiden wären ein wenig rückwärts, wie in Ihrer Beschreibung hervorgehoben (wenn Sie Elemente beschreiben, müssen Sie immer das Wort "Nachkomme" verwenden, da es etwas optionaler ist, wenn Sie über Nachkommen sprechen
Mattisdada
16

Descendantsdurchsucht den gesamten Teilbaum des aktuellen Elements nach dem angegebenen Namen (oder gibt eine abgeflachte Version des Baums zurück, wenn kein Name angegeben ist), während Elementsnur die unmittelbaren untergeordneten Elemente des aktuellen Elements durchsucht werden.

Adam Robinson
quelle