如何使用xmllint --xpath提取XML节点内容与属性值
RHEL环境下仅用xmllint提取XML目标值方案
匹配失败根因
之前提取失败和空白字符处理无关,核心原因是目标XML声明了默认命名空间,直接写裸节点名的XPath表达式无法命中对应节点。
单文件提取命令
RHEL预装的xmllint仅支持XPath 1.0,无需手动绑定命名空间前缀、一次调用即可同时提取两个目标值的命令如下,直接输出两行结果,第一行为<model>标签的mh属性值,第二行为目标<attribute>标签的文本:
xmllint --xpath "concat(string(//*[local-name()='model']/@mh), ' ', string(//*[local-name()='model']/*[local-name()='attribute' and @id='0x12345']), ' ')" 你的xml文件路径
命令中
是XML转义格式的换行符,local-name()写法可以绕开默认命名空间的匹配限制,不需要手动填写XML中冗长的命名空间地址,同结构XML即使命名空间地址变动也能正常匹配。
批量处理脚本
针对5000+份XML文件的批量处理需求,直接使用下面的shell脚本即可,脚本会自动遍历当前目录下所有xml文件,空值/提取失败的字段自动替换为NOTHING,最终输出完全符合要求的交替行格式,结果存入device_list.txt:
#!/bin/bash for xml_file in ./*.xml; do mh_val=$(xmllint --xpath "string(//*[local-name()='model']/@mh)" "$xml_file" 2>/dev/null) attr_val=$(xmllint --xpath "string(//*[local-name()='model']/*[local-name()='attribute' and @id='0x12345'])" "$xml_file" 2>/dev/null) [ -z "$mh_val" ] && mh_val="NOTHING" [ -z "$attr_val" ] && attr_val="NOTHING" echo "$mh_val" echo "$attr_val" done > device_list.txt
使用说明
- 如果目标
<attribute>标签的id不是0x12345,直接替换脚本中对应位置的id值即可 - 脚本自动屏蔽XML格式错误的报错信息,遇到损坏文件不会中断批量任务,对应字段自动填充为
NOTHING - 单文件提取速度极快,5000份文件处理耗时通常在数秒内,无性能问题
附本次测试用的XML结构参考:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <model-response-list xmlns="http://www.website.com/thing/link/linktothing/linklink" total-models="1" throttle="1" error="EndOfResults"> <model-responses> <model mh="0x12345678"> <attribute id="0x12345">EXTRACT_THIS_PLEASE</attribute> </model> </model-responses> </model-response-list>
内容的提问来源于stack exchange,提问作者Musik847
相关产品推荐
相关产品推荐

