如何使用xmlstarlet从root node匹配值并返回对应XPATH?
xmlstarlet 检索目标值并返回对应XPath的实现方案
xmlstarlet没有直接暴露“全局匹配值返回路径”的一键参数,可根据自身安装的版本选择对应实现方式:
版本1.6.0及以上(最简便方案)
使用ed子命令的--print-path参数,该参数会直接输出匹配到节点的完整XPath路径,搭配简单的文本切分即可拿到纯路径结果:
- 精确匹配节点文本(自动忽略前后空白、换行),返回对应XPath:
# 把【精确匹配值】和【你的xml文件路径】替换成实际内容即可 xmlstarlet ed --match "//*[normalize-space(text())='精确匹配值']" --print-path 你的xml文件路径 | cut -d: -f1
- 模糊匹配包含目标关键字的节点:
xmlstarlet ed --match "//*[contains(text(),'匹配关键字')]" --print-path 你的xml文件路径 | cut -d: -f1
- 匹配等于目标值的属性,返回所属节点XPath+属性名:
xmlstarlet ed --match "//@*[.='目标属性值']" --print-path 你的xml文件路径 | cut -d: -f1
低版本兼容方案(无--print-path参数时使用)
低版本xmlstarlet基于XPath 1.0实现,没有内置路径输出能力,可通过遍历祖先节点拼接路径的方式实现,输出的路径自带同标签兄弟节点索引,可唯一定位目标节点:
xmlstarlet sel -t -m '//*[text()="你的目标匹配值"]' \ -m 'ancestor-or-self::*' \ -o '/' -v 'name()' \ -o '[' -v '1 + count(preceding-sibling::*[name() = name(current())])' -o ']' \ -n 你的xml文件路径
效果验证
用如下测试XML做验证:
<root> <item id="1">第一个条目</item> <item id="2">第二个条目</item> <content> <para>测试匹配文本</para> </content> </root>
执行匹配文本测试匹配文本的命令后,会返回标准唯一定位XPath:/root[1]/content[1]/para[1]
内容的提问来源于stack exchange,提问作者Robber Pen
相关产品推荐
相关产品推荐

