如何使用XPath选择一组节点的所有子节点及当前节点的所有子节点?
XPath 节点选择问题解答及C#示例
我来帮你理清这两个常见的XPath节点选择问题,结合实际的C#代码来解释:
问题1:如何用XPath选择一组节点的所有子节点?
如果你已经选中了一组节点(比如示例里的//PRODUCT,也就是所有PRODUCT节点),要获取每个节点的所有子节点,可以在相对路径中使用./node()语法。这里的.代表当前节点上下文,node()会匹配所有类型的子节点(包括元素、文本节点、注释等);如果只需要元素类型的子节点,用./*即可。
在你的代码示例中,已经通过SelectNodes("//PRODUCT")拿到了所有PRODUCT节点的集合,之后遍历每个productNode时,就可以用相对路径来选取它的子节点,比如./SUPPLIER_PID就是选取当前PRODUCT节点下的SUPPLIER_PID子元素。
问题2:如何用XPath选择当前节点的所有子节点?
针对单个当前节点(比如遍历中的productNode),有几种常用写法:
node():在当前节点的上下文环境中,直接写node()就会匹配它的所有子节点(包含各类节点)./node():和上面效果一致,.明确指定当前节点,可读性更强- 如果只需要元素子节点,用
*或者./*就可以
完整C#代码示例
XmlNodeList productNodes = doc.DocumentElement.SelectNodes("//PRODUCT"); Parallel.ForEach(productNodes.Cast<XmlNode>(), (XmlNode productNode) => { string _productMode = XmlUtils.nodeAsString(productNode, "@mode"); Product product = new Product() { Mode = XmlUtils.nodeAsString(productNode, "@mode"), No = XmlUtils.nodeAsString(productNode, "./SUPPLIER_PID"), DescriptionShort = XmlUtils.nodeAsString(productNode, "./PRODUCT_DETAILS/DESCRIPTION_SHORT") // 可继续补充其他属性赋值逻辑 }; // 后续可添加product的业务处理代码 });
补充说明:
@mode是选取当前节点的mode属性,属于属性节点的选择语法./SUPPLIER_PID是选取当前PRODUCT节点下的直接子元素SUPPLIER_PID./PRODUCT_DETAILS/DESCRIPTION_SHORT是选取当前节点下PRODUCT_DETAILS子节点中的DESCRIPTION_SHORT元素
内容的提问来源于stack exchange,提问作者causeofhell
相关产品推荐
相关产品推荐

