Ответы:
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
искать только непосредственные дочерние элементы текущего элемента.