Apa perbedaan antara Linq dengan XML Descendants and Elements

181

Saya telah menemukan kedua kata kunci ini di IntelliSense VS. Saya mencoba mencari perbedaan di antara mereka dan tidak mendapatkan jawaban yang jelas. Yang mana dari ini memiliki kinerja terbaik dengan file XML kecil hingga menengah. Terima kasih

Luke101
sumber

Jawaban:

292

Elementshanya menemukan unsur-unsur yang merupakan keturunan langsung , yaitu anak-anak langsung.

Descendants menemukan anak-anak di tingkat mana pun, yaitu anak-anak, cucu, dll ...


Berikut adalah contoh yang menunjukkan perbedaan:

<?xml version="1.0" encoding="utf-8" ?>
<foo>
    <bar>Test 1</bar>
    <baz>
        <bar>Test 2</bar>
    </baz>
    <bar>Test 3</bar>
</foo>

Kode:

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

Hasil:

Elemen: Uji 1
Elemen: Tes 3
Keturunan: Tes 1
Keturunan: Tes 2
Keturunan: Tes 3

Jika Anda tahu bahwa unsur-unsur yang Anda inginkan adalah anak-anak segera maka Anda akan mendapatkan kinerja yang lebih baik jika Anda menggunakan Elementsbukan Descendants.

Mark Byers
sumber
Jawaban yang bagus, saya selalu berpikir keduanya sedikit mundur seperti yang disorot dalam deskripsi Anda (ketika menggambarkan Elemen, Anda selalu perlu menggunakan kata "turunan" di mana karena sedikit lebih opsional ketika berbicara tentang Keturunan
Mattisdada
16

Descendantsakan mencari seluruh subtree elemen saat ini untuk nama yang ditentukan (atau akan mengembalikan versi pohon yang rata jika tidak ada nama yang diberikan), sedangkan Elementsmencari hanya anak-anak langsung dari elemen saat ini.

Adam Robinson
sumber