В чем разница между Linq и потомками XML и элементами

Я столкнулся с этими двумя ключевыми словами в VS IntelliSense. Я пытался разыграть разницу между ними и не получил четкого ответа. Какой из них имеет лучшую производительность с небольшими и средними XML файлами. Благодаря

Ответ 1

Elements находит только те элементы, которые являются прямыми потомками, т.е. непосредственными детьми.

Descendants находит детей на любом уровне, то есть детей, внуков и т.д.


Вот пример, демонстрирующий разницу:

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

код:

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

Результат:

Elements : Test 1
Elements : Test 3
Descendants : Test 1
Descendants : Test 2
Descendants : Test 3

Если вы знаете, что нужные вам элементы являются непосредственными детьми, тогда вы получите лучшую производительность, если используете Elements вместо Descendants.

Ответ 2

Descendants выполнит поиск по всему поддереву текущего элемента для указанного имени (или вернет сглаженную версию дерева, если имя не указано), тогда как Elements выполняет поиск только ближайших дочерних элементов текущего элемента.