C#中如何通过XPath获取XmlNode节点的所有直接子节点集合
获取XmlNode所有直接子节点的正确XPath写法
正确写法
要获取当前节点的仅直接子元素节点,使用以下两种等价的XPath写法即可:
- 简写形式:
* - 完整轴声明形式:
child::*
针对示例的使用效果
对你给出的<actions>节点示例,当actionNode正确指向<actions>节点时,执行actionNode.SelectNodes("*")会准确返回两个直接子节点:
<if operation="A"><store>value</store>
不会包含嵌套在内部的子if、子store等后代节点。
查询返回全层级节点的常见原因
child::*本身的语义就是仅查询直接子级,出现返回全层级节点的情况,通常是以下两种错误导致:
- XPath语法写错:如果写为
.//*、descendant::*,语义就是查询当前节点下所有层级的后代元素,自然会返回全部嵌套节点 - 遍历逻辑错误:拿到直接子节点集合后,递归遍历了每个子节点的内部节点,误以为是
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
相关产品推荐
相关产品推荐

