Ответы:
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);
}
Результат:
Элементы: Тест 1 Элементы: Тест 3 Потомки: тест 1 Потомки: тест 2 Потомки: тест 3
Если вы знаете, что элементы, которые вы хотите, являются непосредственными дочерними элементами, вы получите лучшую производительность, если будете использовать Elementsвместо Descendants.
Descendantsбудет искать указанное поддельное имя во всем поддереве текущего элемента (или вернет плоскую версию дерева, если имя не указано), тогда как будет Elementsискать только непосредственные дочерние элементы текущего элемента.