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

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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.