Respostas:
Elements
encontra apenas os elementos que são descendentes diretos , ou seja, filhos imediatos.
Descendants
encontra crianças em qualquer nível, ou seja, filhos, netos, etc.
Aqui está um exemplo demonstrando a diferença:
<?xml version="1.0" encoding="utf-8" ?>
<foo>
<bar>Test 1</bar>
<baz>
<bar>Test 2</bar>
</baz>
<bar>Test 3</bar>
</foo>
Código:
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);
}
Resultado:
Elementos: Teste 1 Elementos: Teste 3 Descendentes: Teste 1 Descendentes: Teste 2 Descendentes: Teste 3
Se você sabe que os elementos que deseja são filhos imediatos, obterá melhor desempenho se usar em Elements
vez de Descendants
.
Descendants
procurará na subárvore inteira do elemento atual o nome especificado (ou retornará uma versão achatada da árvore se nenhum nome for fornecido), enquanto Elements
pesquisa apenas os filhos imediatos do elemento atual.