子节点导航/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

相关新闻

最新新闻

AI明星带货视频生成系统:数字人、声音克隆与本地部署实战

AI明星带货视频生成系统:数字人、声音克隆与本地部署实战

“AI明星带货”这个词,最近出现的频率越来越高。乍一看像是营销号的夸张说法,但拆开看背后其实是一套已经跑通的技术链路:数字人形象生成、声音克隆、口型同步、视频一键成片。把它们组合起来,确实能做出“以假乱真”的带货短视频…

2026/8/28 8:34:49
AI 带火挖掘机:土木工程智能化的技术路径与实践

AI 带火挖掘机:土木工程智能化的技术路径与实践

“AI 带火挖掘机”最近在工程圈里被反复讨论。表面看这是一条行业新闻,实际指向的却是土木工程建设正在发生的一轮技术转向:挖掘机、设计院、施工现场这些传统场景,开始大量接入视觉识别、路径规划、自动化控制、数据建模和模型部署能力。对土…

2026/8/28 8:34:49
AI Agent开发:如何评估与选择Web Search API?

AI Agent开发:如何评估与选择Web Search API?

做 AI Agent 开发这段时间,我最大的感受是:模型能力决定 Agent 的上限,但工具调用质量决定 Agent 的下限。所有工具里,web search 又是最特殊的一个——几乎每个 Agent 都要用,但市面上大多数搜索 API 并不是为 Agent …

2026/8/28 8:34:49
具身智能技术栈解析:从宇树机器人看开发者如何入门二次开发

具身智能技术栈解析:从宇树机器人看开发者如何入门二次开发

“宇树发行市值600亿,梁文锋投了”——这条消息在科技圈刷屏的时候,很多人的第一反应是看估值、看投资人名单。但如果你是一个开发者,真正值得盯着看的不是数字,而是这家公司背后的技术栈已经走到了哪一步。一位做大模型出身的AI创…

2026/8/28 8:34:49
NeSy-RAG:融合神经符号推理,让企业知识库问答可解释、可追溯

NeSy-RAG:融合神经符号推理,让企业知识库问答可解释、可追溯

最近在做知识库问答项目时,我发现一个很典型的问题:普通 RAG 可以快速给出答案,但当你追问“这个结论是怎么来的”“它依据了哪条规则”,它往往只能给你一段语义相近的文本切片,很难给出严谨的推理链路。如果业务场景是…

2026/8/28 8:34:49
ESP32-S2 HMI Dev Kit实战:用LVGL打造低成本人机界面

ESP32-S2 HMI Dev Kit实战:用LVGL打造低成本人机界面

用 ESP32-S2 做 HMI 界面,这块 Dev Kit 值得好好拆一拆 最近我在做一款桌面环境监测面板的原型,手里正好有一块以 ESP32-S2 为核心、专门面向 HMI(人机界面)设计的 Dev Kit。这块板子给我的第一感受是:它不是那种功能堆…

2026/8/28 8:29:49