Nodes () против DescendantNodes () использует? - PullRequest
3 голосов
/ 24 марта 2012

Я прочитал, что Nodes () испускает все узлы, включая sub.

и DescendantNodes () одинаково, но рекурсивно.

однако - я не могу найти ни одногоситуация, в которой мне понадобится рекурсивный способ ...

Когда я предпочитаю работать с DescendantNodes (), а не Nodes ()?

, то есть:

enter image description here

 IEnumerable<XNode> nodes =from nd in xmlTree.DescendantNodes()
                select nd;
            foreach (XNode node in nodes)
                Console.WriteLine(node);

вывод:

enter image description here вопрос:

Зачем мне это нужно рекурсивно разбивать, когда я могу работать с Nodes ()?

1 Ответ

7 голосов
/ 24 марта 2012

Ну узлы дает вам дочерние узлы узла, на котором вы их вызываете, в то время как имя-потомка дает вам узлы-потомки узла, на котором вы его вызываете.

Представьте, что у вас есть XML-документ, который вы хотите обработать с несколькими уровнями вложенности, и вы хотите найти все узлы комментариев на всех уровнях, тогда вы можете сделать

XDocument doc = XDocument.Parse(@"<!-- comment 1 -->
<root>
<!-- comment 2 -->
  <foo>
    <!-- comment 3 -->
    <bar><!-- comment 4 --></bar>
  </foo>
</root>
<!-- comment 5 -->");

    foreach (XComment comment in doc.DescendantNodes().OfType<XComment>())
    {
        Console.WriteLine(comment.Value);
    }

Если вы использовали исключительно метод Nodes, вам нужно написать рекурсивный метод для поиска всех узлов комментариев.

...