基于xmllint在XML的article标签内匹配reference值并提取节点内容
实现方案
直接用XPath的谓词筛选逻辑即可实现需求,核心思路是先匹配<reference>子节点值等于目标编号的<article>节点,再在该节点范围内提取目标子标签内容,不会跨节点拿到其他article的同名字段。
通用写法模板
对应的xmllint命令格式如下:
xmllint --xpath "string(//article[reference='你的目标reference编号']/要提取的目标子标签路径)" 你的xml文件路径
用法示例
基于你给出的XML样例,可直接参考以下命令:
- 提取reference编号为
10001的article发布日期
xmllint --xpath "string(//article[reference='10001']/publicationDate)" file.xml
执行返回结果:2022-02-13
- 提取reference编号为
10000的article下嵌套在author节点里的作者名
xmllint --xpath "string(//article[reference='10000']/author/name)" file.xml
执行返回结果:Example Name 1
动态传参说明
如果是在shell脚本中动态传入reference编号和目标标签,注意引号嵌套规则即可,参考写法:
#!/bin/bash # 动态赋值参数 target_ref=10001 target_tag=text # 执行提取 xmllint --xpath "string(//article[reference='$target_ref']/$target_tag)" file.xml
兼容处理
如果XML中可能存在多个reference编号相同的article节点,建议在筛选条件后加位置下标固定取第一个匹配项,避免返回多值异常:
# 取reference=10000的第一个匹配article的title值 xmllint --xpath "string(//article[reference='10000'][1]/title)" file.xml
语法说明:XPath中跟在节点后方的
[筛选条件]是谓词语法,会对前方选中的节点集做过滤,这里[reference='xxx']的作用就是仅保留存在子节点<reference>且其文本值等于指定编号的article节点,后续的子标签查找会自动限定在符合条件的article节点范围内。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

