子节点导航/Child Node Navigation 返回类型成员目标对象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

相关新闻

最新新闻

高效构建CARLA自动驾驶仿真环境:从零到实战的完整指南

高效构建CARLA自动驾驶仿真环境:从零到实战的完整指南

高效构建CARLA自动驾驶仿真环境:从零到实战的完整指南 【免费下载链接】carla Open-source simulator for autonomous driving research. 项目地址: https://gitcode.com/gh_mirrors/ca/carla 自动驾驶仿真环境搭建总是充满挑战,从复杂的依赖配置…

2026/7/5 16:33:37
终极指南:如何在电脑上免费玩PS4游戏——shadPS4跨平台模拟器完整教程

终极指南:如何在电脑上免费玩PS4游戏——shadPS4跨平台模拟器完整教程

终极指南:如何在电脑上免费玩PS4游戏——shadPS4跨平台模拟器完整教程 【免费下载链接】shadPS4 PlayStation 4 emulator for Windows, Linux, macOS and FreeBSD written in C 项目地址: https://gitcode.com/GitHub_Trending/sh/shadPS4 还在为PS4游戏只能…

2026/7/5 16:33:37
LIO-SAM多机器人协同建图:从单机到分布式系统的技术演进与实现策略

LIO-SAM多机器人协同建图:从单机到分布式系统的技术演进与实现策略

LIO-SAM多机器人协同建图:从单机到分布式系统的技术演进与实现策略 【免费下载链接】LIO-SAM LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping 项目地址: https://gitcode.com/GitHub_Trending/li/LIO-SAM 激光雷达惯性里程计系…

2026/7/5 16:33:37
终极免费KIMI AI API部署指南:5分钟搭建企业级AI对话系统

终极免费KIMI AI API部署指南:5分钟搭建企业级AI对话系统

终极免费KIMI AI API部署指南:5分钟搭建企业级AI对话系统 【免费下载链接】kimi-free-api 🚀 KIMI AI 长文本大模型逆向API【特长:长文本解读整理】,支持高速流式输出、智能体对话、联网搜索、探索版、K1思考模型、长文档解读、图…

2026/7/5 16:33:37
如何用AI在3分钟内生成高质量短视频?MoneyPrinterTurbo全自动解决方案

如何用AI在3分钟内生成高质量短视频?MoneyPrinterTurbo全自动解决方案

如何用AI在3分钟内生成高质量短视频?MoneyPrinterTurbo全自动解决方案 【免费下载链接】MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频 Generate short videos with one click using AI LLM. 项目地址: https://gitcode.com/GitHub_Trending/mo/…

2026/7/5 16:33:37
如何用WiFi信号“看见“人体姿态:RuView无摄像头感知技术终极指南

如何用WiFi信号“看见“人体姿态:RuView无摄像头感知技术终极指南

如何用WiFi信号"看见"人体姿态:RuView无摄像头感知技术终极指南 【免费下载链接】RuView π RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel …

2026/7/5 16:28:37

月新闻