返回类型成员目标对象XNodeFirstNode { get; }XContainerLastNode { get; }XContainerIEnumerableXNodeNodes()XContainer*DescendantNodes()XContainer*DescendantNodesAndSelf()XElement*XElementElement (XName)XContainerIEnumerableXElementElements()XContainer*Elements (XName)XContainer*Descendants()XContainer*Descendants (XName)XContainer*DescendantsAndSelf()XElement*DescendantsAndSelf (XName)XElement*boolHasElements { get; }XElement在目标对象列标记了*的函数同样可以应用于该目标对象sequence本系列LINQ to XML博客中其他表格也一样。例如我们可以对一个XContainer或XContainer sequence调用Nodes()函数。作用于sequence的函数会把针对其中每个元素所得的结果连接起来。之所以可以这样工作是因为定义在System.Xml.Linq中的扩展方法即前面提到的补充查询运算符。FirstNode, LastNode, 和NodesFirstNode和LastNode可以让我们直接访问第一个和最后一个子节点Nodes返回所有的子节点到一个sequence中。所有三个方法都只返回直接的后代节点。示例如下var bench new XElement(bench, new XElement(toolbox, new XElement(handtool, Hammer), new XElement(handtool, Rasp) ), new XElement(toolbox, new XElement(handtool, Saw), new XElement(powertool, Nailgun) ), new XComment(Be careful with the nailgun) ); foreach (XNode node in bench.Nodes()) Console.WriteLine(node.ToString(SaveOptions.DisableFormatting)); //输出如下 toolboxhandtoolHammer/handtoolhandtoolRasp/handtool/toolbox toolboxhandtoolSaw/handtoolpowertoolNailgun/powertool/toolbox !--Be careful with the nailgun--检索元素Elements方法仅返回XElement类型的子节点foreach (XElement e in bench.Elements()) Console.WriteLine(e.Name e.Value); // 输出 toolboxHammerRasp toolboxSawNailgun下面的LINQ查询查找包含”Nailgun”的toolboxIEnumerablestring query from toolbox in bench.Elements() where toolbox.Elements().Any (tool tool.Value Nailgun) select toolbox.Value; RESULT: { SawNailgun }下面的示例使用一个SelectMany查询来检索hand toolsIEnumerablestring query from toolbox in bench.Elements() from tool in toolbox.Elements() where tool.Name handtool select tool.Value; RESULT: { Hammer, Rasp, Saw }Elements方法等价于在Nodes上的一个LINQ查询比如前一个示例中的Elements方法也可以用如下查询实现from toolbox in bench.Nodes().OfTypeXElement() where ...Elements也可以只返回给定名字的elements如int x bench.Elements (toolbox).Count(); // 2 // 等价于 int x bench.Elements().Where (e e.Name toolbox).Count(); // 2IEnumerableXContainer也定义了名为Elements的扩展方法这让我们可以对一个element sequence调用Elements方法。所以上面检索hand tools的SelectMany查询可以重写为如下形式IEnumerablestring query from tool in bench.Elements(toolbox).Elements(handtool) select tool.Value;第一个Elements方法绑定到XContainer的实例方法而第二个则会调用IEnumerableXContainer中的扩展方法。检索单个元素单数形式的Element方法返回匹配给定名称的第一个元素。Element对于单个元素的导航非常有用示例如下XElement settings XElement.Load(databaseSettings.xml); string cs settings.Element(database).Element(connectString).Value;Element等价于在Elements()之后应用LINQ的FirstOrDefault查询运算符指定一个name匹配条件。如果查询的元素不存在Element返回null。如果xyz元素不存在Element(xyz).Value会抛出空引用异常。如果我们希望得到一个null值而不是异常则可以把XElement转为一个string而不是查询它的Value属性string xyz (string)settings.Element(xyz);这种方法之所以可行是因为XElement定义了显示的到string类型的转换为的就是这个目的。如果element存在(string)element返回其Value属性否则返回null。递归函数XContainer还提供了Descendants和DescendantNodes方法用来递归地返回child elements或nodes即所有的后代elements或nodes。Descendants可选的接受一个element名称。回到我们前面的例子我们可以使用Descendants来找到所有的hand toolsConsole.WriteLine(bench.Descendants(handtool).Count()); // 3调用Descendants方法时符合条件的parent和leaf nodes都会被包含进来 如下所示foreach (XNode node in bench.DescendantNodes()) Console.WriteLine(node.ToString(SaveOptions.DisableFormatting)); // 结果如下: toolboxhandtoolHammer/handtoolhandtoolRasp/handtool/toolbox handtoolHammer/handtool Hammer handtoolRasp/handtool Rasp toolboxhandtoolSaw/handtoolpowertoolNailgun/powertool/toolbox handtoolSaw/handtool Saw powertoolNailgun/powertool Nailgun !--Be careful with the nailgun--下面的查询会检索出所有包含”careful”的XML注释而不管该注释位于X-DOM之内的任何位置IEnumerablestring query from c in bench.DescendantNodes().OfTypeXComment() where c.Value.Contains(careful) orderby c.Value select c.Value;父节点导航/Parent Navigation所有的XNodes都为父节点导航提供了Parent属性和AncestorXXX方法。一个Parent/父节点总是一个XElement返回类型成员目标对象XElementParent { get; }XNode*EnumerableXElementAncestors()XNode*Ancestors (XName)XNode*AncestorsAndSelf()XElement*AncestorsAndSelf (XName)XElement*如果x是一个XElement下面的语句总是输出trueforeach (XNode child in x.Nodes()) Console.WriteLine(child.Parent x);但如果x是一个XDocument行为则有所不同。XDocument的特殊性在于它可以有children但它永远都不会成为其他node的parent要存取XDocument我们必须使用Document属性它对X-DOM tree中的任意对象都有效。Ancestors返回一个sequence它的第一个element是Parent节点下一个节点是Parent.Parent依次类推直到根节点。我们可以通过如下的LINQ查询来得到根节点AncestorsAndSelf().Last()。另一种得到根节点的方法是调用Document.Root当然这种方法只能在XDocument对象存在的情况下使用。兄弟节点导航/Peer Node Navigation返回类型成员目标对象boolIsBefore (XNode node)XNodeIsAfter (XNode node)XNodeXNodePreviousNode { get; }XNodeNextNode { get; }XNodeIEnumerableXNodeNodesBeforeSelf()XNodeNodesAfterSelf()XNodeIEnumerableXElementElementsBeforeSelf()XNodeElementsBeforeSelf (XName name)XNode
子节点导航/Child Node Navigation
发布时间:2026/7/5 14:28:25
返回类型成员目标对象XNodeFirstNode { get; }XContainerLastNode { get; }XContainerIEnumerableXNodeNodes()XContainer*DescendantNodes()XContainer*DescendantNodesAndSelf()XElement*XElementElement (XName)XContainerIEnumerableXElementElements()XContainer*Elements (XName)XContainer*Descendants()XContainer*Descendants (XName)XContainer*DescendantsAndSelf()XElement*DescendantsAndSelf (XName)XElement*boolHasElements { get; }XElement在目标对象列标记了*的函数同样可以应用于该目标对象sequence本系列LINQ to XML博客中其他表格也一样。例如我们可以对一个XContainer或XContainer sequence调用Nodes()函数。作用于sequence的函数会把针对其中每个元素所得的结果连接起来。之所以可以这样工作是因为定义在System.Xml.Linq中的扩展方法即前面提到的补充查询运算符。FirstNode, LastNode, 和NodesFirstNode和LastNode可以让我们直接访问第一个和最后一个子节点Nodes返回所有的子节点到一个sequence中。所有三个方法都只返回直接的后代节点。示例如下var bench new XElement(bench, new XElement(toolbox, new XElement(handtool, Hammer), new XElement(handtool, Rasp) ), new XElement(toolbox, new XElement(handtool, Saw), new XElement(powertool, Nailgun) ), new XComment(Be careful with the nailgun) ); foreach (XNode node in bench.Nodes()) Console.WriteLine(node.ToString(SaveOptions.DisableFormatting)); //输出如下 toolboxhandtoolHammer/handtoolhandtoolRasp/handtool/toolbox toolboxhandtoolSaw/handtoolpowertoolNailgun/powertool/toolbox !--Be careful with the nailgun--检索元素Elements方法仅返回XElement类型的子节点foreach (XElement e in bench.Elements()) Console.WriteLine(e.Name e.Value); // 输出 toolboxHammerRasp toolboxSawNailgun下面的LINQ查询查找包含”Nailgun”的toolboxIEnumerablestring query from toolbox in bench.Elements() where toolbox.Elements().Any (tool tool.Value Nailgun) select toolbox.Value; RESULT: { SawNailgun }下面的示例使用一个SelectMany查询来检索hand toolsIEnumerablestring query from toolbox in bench.Elements() from tool in toolbox.Elements() where tool.Name handtool select tool.Value; RESULT: { Hammer, Rasp, Saw }Elements方法等价于在Nodes上的一个LINQ查询比如前一个示例中的Elements方法也可以用如下查询实现from toolbox in bench.Nodes().OfTypeXElement() where ...Elements也可以只返回给定名字的elements如int x bench.Elements (toolbox).Count(); // 2 // 等价于 int x bench.Elements().Where (e e.Name toolbox).Count(); // 2IEnumerableXContainer也定义了名为Elements的扩展方法这让我们可以对一个element sequence调用Elements方法。所以上面检索hand tools的SelectMany查询可以重写为如下形式IEnumerablestring query from tool in bench.Elements(toolbox).Elements(handtool) select tool.Value;第一个Elements方法绑定到XContainer的实例方法而第二个则会调用IEnumerableXContainer中的扩展方法。检索单个元素单数形式的Element方法返回匹配给定名称的第一个元素。Element对于单个元素的导航非常有用示例如下XElement settings XElement.Load(databaseSettings.xml); string cs settings.Element(database).Element(connectString).Value;Element等价于在Elements()之后应用LINQ的FirstOrDefault查询运算符指定一个name匹配条件。如果查询的元素不存在Element返回null。如果xyz元素不存在Element(xyz).Value会抛出空引用异常。如果我们希望得到一个null值而不是异常则可以把XElement转为一个string而不是查询它的Value属性string xyz (string)settings.Element(xyz);这种方法之所以可行是因为XElement定义了显示的到string类型的转换为的就是这个目的。如果element存在(string)element返回其Value属性否则返回null。递归函数XContainer还提供了Descendants和DescendantNodes方法用来递归地返回child elements或nodes即所有的后代elements或nodes。Descendants可选的接受一个element名称。回到我们前面的例子我们可以使用Descendants来找到所有的hand toolsConsole.WriteLine(bench.Descendants(handtool).Count()); // 3调用Descendants方法时符合条件的parent和leaf nodes都会被包含进来 如下所示foreach (XNode node in bench.DescendantNodes()) Console.WriteLine(node.ToString(SaveOptions.DisableFormatting)); // 结果如下: toolboxhandtoolHammer/handtoolhandtoolRasp/handtool/toolbox handtoolHammer/handtool Hammer handtoolRasp/handtool Rasp toolboxhandtoolSaw/handtoolpowertoolNailgun/powertool/toolbox handtoolSaw/handtool Saw powertoolNailgun/powertool Nailgun !--Be careful with the nailgun--下面的查询会检索出所有包含”careful”的XML注释而不管该注释位于X-DOM之内的任何位置IEnumerablestring query from c in bench.DescendantNodes().OfTypeXComment() where c.Value.Contains(careful) orderby c.Value select c.Value;父节点导航/Parent Navigation所有的XNodes都为父节点导航提供了Parent属性和AncestorXXX方法。一个Parent/父节点总是一个XElement返回类型成员目标对象XElementParent { get; }XNode*EnumerableXElementAncestors()XNode*Ancestors (XName)XNode*AncestorsAndSelf()XElement*AncestorsAndSelf (XName)XElement*如果x是一个XElement下面的语句总是输出trueforeach (XNode child in x.Nodes()) Console.WriteLine(child.Parent x);但如果x是一个XDocument行为则有所不同。XDocument的特殊性在于它可以有children但它永远都不会成为其他node的parent要存取XDocument我们必须使用Document属性它对X-DOM tree中的任意对象都有效。Ancestors返回一个sequence它的第一个element是Parent节点下一个节点是Parent.Parent依次类推直到根节点。我们可以通过如下的LINQ查询来得到根节点AncestorsAndSelf().Last()。另一种得到根节点的方法是调用Document.Root当然这种方法只能在XDocument对象存在的情况下使用。兄弟节点导航/Peer Node Navigation返回类型成员目标对象boolIsBefore (XNode node)XNodeIsAfter (XNode node)XNodeXNodePreviousNode { get; }XNodeNextNode { get; }XNodeIEnumerableXNodeNodesBeforeSelf()XNodeNodesAfterSelf()XNodeIEnumerableXElementElementsBeforeSelf()XNodeElementsBeforeSelf (XName name)XNode