You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何通过XPath获取XmlNode节点的所有直接子节点集合

获取XmlNode所有直接子节点的正确XPath写法

正确写法

要获取当前节点的仅直接子元素节点,使用以下两种等价的XPath写法即可:

  • 简写形式:*
  • 完整轴声明形式:child::*

针对示例的使用效果

对你给出的<actions>节点示例,当actionNode正确指向<actions>节点时,执行actionNode.SelectNodes("*")会准确返回两个直接子节点:

  • <if operation="A">
  • <store>value</store>

不会包含嵌套在内部的子if、子store等后代节点。

查询返回全层级节点的常见原因

child::*本身的语义就是仅查询直接子级,出现返回全层级节点的情况,通常是以下两种错误导致:

  1. XPath语法写错:如果写为.//*、descendant::*,语义就是查询当前节点下所有层级的后代元素,自然会返回全部嵌套节点
  2. 遍历逻辑错误:拿到直接子节点集合后,递归遍历了每个子节点的内部节点,误以为是SelectNodes返回的结果本身包含多层节点

补充场景

如果需要获取所有类型的直接子节点(包含文本节点、注释节点、处理指令等,不止是元素节点),将XPath改为node()即可:
actionNode.SelectNodes("node()")

C# 完整示例代码

using System.Xml;

class Program
{
    static void Main()
    {
        string xmlContent = @"
<actions>
    <if operation=""A""> 
       <if operation=""B"">
            <store>some value</store>
            <if operation=""C""> .... </if>
       </if>
    </if>
    <store>value</store>
</actions>";
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(xmlContent);
        XmlNode actionNode = xmlDoc.SelectSingleNode("/actions");
        
        // 获取直接子元素
        XmlNodeList directChildren = actionNode.SelectNodes("*");
        
        // 输出验证,只会打印2条结果
        foreach (XmlNode child in directChildren)
        {
            string opAttr = child.Attributes["operation"] != null ? child.Attributes["operation"].Value : "无";
            Console.WriteLine($"节点名称:{child.Name},operation属性:{opAttr}");
        }
    }
}

内容的提问来源于stack exchange,提问作者NirMH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:45:05