XPath如何仅选取单一层级直接子元素 排除后代节点内容
XPath选取根节点直接子元素(不带后代内容)实现方法
问题场景
现有如下XML文件:
<root xmlns:foo="" xmlns:bar=""> <actors> <actor id="1">Christian Bale</actor> <actor id="2">Liam Neeson</actor> <actor id="3">Michael Caine</actor> </actors> <foo:singers> <foo:singer id="4">Tom Waits</foo:singer> <foo:singer id="5">B.B. King</foo:singer> <foo:singer id="6">Ray Charles</foo:singer> </foo:singers> </root>
需要通过XPath查询得到如下结果,仅返回root节点的第一层直接子元素标签,不包含子元素下的所有后代内容:
<actors> </actors> <foo:singers> </foo:singers>
使用/root/*语法查询时,返回的结果会携带子元素下的所有后代节点,内容如下,不符合需求:
<actors> <actor id="1">Christian Bale</actor> <actor id="2">Liam Neeson</actor> <actor id="3">Michael Caine</actor> </actors>
<foo:singers> <foo:singer id="4">Tom Waits</foo:singer> <foo:singer id="5">B.B. King</foo:singer> <foo:singer id="6">Ray Charles</foo:singer> </foo:singers>
核心说明
首先澄清一个常见误区:/root/*的XPath选取逻辑本身是完全正确的。
XPath语法中,单斜杠/代表严格的直接父子层级关系,/root/*只会选中root节点下的第一层直接子元素(也就是<actors>和<foo:singers>两个节点),不会选中孙级的<actor>、<foo:singer>节点。你看到返回结果包含孙级内容,是XML解析器在序列化输出选中的节点时,默认会把该节点内部的整个子树全部打印出来,和XPath的选取逻辑无关。
实现方案
要得到不带内部后代内容的空标签结果,不需要修改XPath选取语句,只需要调整节点序列化输出的逻辑即可,常见实现方式如下:
- 支持XPath 2.0/3.0的解析器(比如Saxon、BaseX):直接配置序列化规则,设置节点输出深度为1,丢弃选中元素的所有子节点后输出即可。
- 通用编程语言场景(Python/Java/JS等带XML解析库的环境):先用
/root/*拿到所有直接子元素的节点集合,遍历每个节点时,只提取节点的标签名、命名空间映射,创建同名的空元素再序列化输出,不要直接序列化原始选中的节点。
以Python的lxml库为例,实现代码如下:
from lxml import etree # 加载XML内容 xml_content = """<root xmlns:foo="" xmlns:bar=""> <actors> <actor id="1">Christian Bale</actor> <actor id="2">Liam Neeson</actor> <actor id="3">Michael Caine</actor> </actors> <foo:singers> <foo:singer id="4">Tom Waits</foo:singer> <foo:singer id="5">B.B. King</foo:singer> <foo:singer id="6">Ray Charles</foo:singer> </foo:singers> </root>""" root = etree.fromstring(xml_content.encode("utf-8")) # 选取root的所有直接子元素 direct_children = root.xpath("/root/*") # 逐个生成空标签输出 for child in direct_children: empty_node = etree.Element(child.tag, nsmap=child.nsmap) print(etree.tostring(empty_node, encoding="unicode"))
运行后即可得到预期的空标签输出。
内容的提问来源于stack exchange,提问作者Mingli Yang
相关产品推荐
相关产品推荐

