【发布时间】:2014-03-17 14:12:23
【问题描述】:
我试图了解扩展方法 DescendantsnNodes 和方法“节点”之间的区别 XDocument。
我可以看到 DescendantsNodes 应该返回此文档或元素的所有后代 并且 Nodes 应该返回此文档或元素的所有子节点。
我不明白“所有子节点”和“所有后代”有什么区别。
有人可以澄清一下吗?
【问题讨论】:
标签: c# linq c#-4.0 linq-to-xml
我试图了解扩展方法 DescendantsnNodes 和方法“节点”之间的区别 XDocument。
我可以看到 DescendantsNodes 应该返回此文档或元素的所有后代 并且 Nodes 应该返回此文档或元素的所有子节点。
我不明白“所有子节点”和“所有后代”有什么区别。
有人可以澄清一下吗?
【问题讨论】:
标签: c# linq c#-4.0 linq-to-xml
子节点是直接在某个节点(父节点)“下方”的节点。后代将是位于同一节点“下方”的节点,但它也可以是子节点“下方”的多个级别。
子节点将是后代,但后代并不总是子节点。
Eg: <Parent><Child1 /><Child2><AnotherNode /></Child2></Parent>
-Parent
|
--> Child1 (Descendant)
|
--> Child2 (Descendant)
|
--> AnotherNode (Descendant, not child)
用一个小代码示例可能更容易可视化:
string someXML = "<Root><Child1>Test</Child1><Child2><GrandChild></GrandChild></Child2></Root>";
var xml = XDocument.Parse(someXML);
Console.WriteLine ("XML:");
Console.WriteLine (xml);
Console.WriteLine ("\nNodes();\n");
foreach (XNode node in xml.Descendants("Root").Nodes())
{
Console.WriteLine ("Child Node:");
Console.WriteLine (node);
Console.WriteLine ("");
}
Console.WriteLine ("DescendantNodes();\n");
foreach (XNode node in xml.Descendants("Root").DescendantNodes())
{
Console.WriteLine ("Descendent Node:");
Console.WriteLine (node);
Console.WriteLine ("");
}
生产:
XML:
<Root>
<Child1>Test</Child1>
<Child2>
<GrandChild></GrandChild>
</Child2>
</Root>
Nodes();
Child Node:
<Child1>Test</Child1>
Child Node:
<Child2>
<GrandChild></GrandChild>
</Child2>
DescendantNodes();
Descendent Node:
<Child1>Test</Child1>
Descendent Node:
Test
Descendent Node:
<Child2>
<GrandChild></GrandChild>
</Child2>
Descendent Node:
<GrandChild></GrandChild>
【讨论】:
给定
<root><child><grandchild>foo</grandchild></child></root>
root元素节点有一个子节点,一个child元素节点,但有三个后代节点,分别是child元素节点、grandchild元素节点和foo文本节点。
【讨论】: