Respuestas:
Elementsencuentra solo aquellos elementos que son descendientes directos , es decir, hijos inmediatos.
Descendants encuentra niños en cualquier nivel, es decir, hijos, nietos, etc.
Aquí hay un ejemplo que demuestra la diferencia:
<?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: Prueba 1 Elementos: Prueba 3 Descendientes: Prueba 1 Descendientes: Prueba 2 Descendientes: Prueba 3
Si sabe que los elementos que desea son elementos secundarios inmediatos, obtendrá un mejor rendimiento si lo utiliza en Elementslugar de hacerlo Descendants.
Descendantsbuscará en el subárbol completo del elemento actual el nombre especificado (o devolverá una versión aplanada del árbol si no se proporciona ningún nombre), mientras que Elementssolo buscará los elementos secundarios inmediatos del elemento actual.