Подтвердить что ты не робот

XDocument.Descendants() и DescendantNodes()

Я просмотрел Nodes() vs DescendantNodes() обычаи?, чтобы увидеть разницу между .Nodes() и .DescendantNodes(), но в чем разница между:

XDocument.Descendants() и XDocument.DescendantNodes()?

var xmlDoc = XDocument.Load(@"c:\Projects\Fun\LINQ\LINQ\App.config");        
var descendants = xmlDoc.Descendants();
var descendantNodes = xmlDoc.DescendantNodes();

foreach (var d in descendants)
    Console.WriteLine(d);

foreach (var d in descendantNodes)
    Console.WriteLine(d);
4b9b3361

Ответ 1

Потомки возвращают только элементы. DescendantNodes возвращает все узлы (включая XComments, XText, XDocumentType и т.д.).

Рассмотрим следующий xml, чтобы увидеть разницу:

<root>
  <!-- comment -->
  <foo>
    <bar value="42"/>Oops!
  </foo>  
</root>

Descendants вернет 3 элемента (root, foo, bar). DescendantNodes вернет эти три элемента и 2 других узла - текст и комментарий.

Ответ 2

Descendants возвращает только элементы-потомки, а DescendantNodes возвращает все типы узлов (элементы, атрибуты, текстовые узлы, комментарии и т.д.)

Итак, Descendants() эквивалентно DescendantNodes().OfType<XElement>().