如何使用xmlstarlet条件提取含错误警告XML的属性?
用xmlstarlet对XML属性做条件提取的实用方案
针对你手里的minimal.xml(包含带subMessage属性的错误/警告消息),我整理了几个常用的条件提取场景和对应的xmlstarlet命令,直接就能用:
1. 提取指定subMessage的所有消息内容
比如你要抓所有subMessage="RSC-012"的错误文本,用这条命令:
xmlstarlet sel -t -m "//message[@subMessage='RSC-012']" -v "." -n minimal.xml
简单解释下:
sel是xmlstarlet的选择操作模式-t定义输出模板-m后面跟XPath表达式,精准匹配带指定subMessage属性的message节点-v "."输出节点的文本内容,-n是添加换行让结果更整洁
2. 只提取符合条件的subMessage属性值
如果不需要消息内容,只想把符合条件的属性值列出来:
xmlstarlet sel -t -m "//message[@subMessage='RSC-012']" -v "@subMessage" -n minimal.xml
这里@subMessage就是直接选择节点的属性值。
3. 按消息类型筛选(比如只抓ERROR级别的消息)
你的消息内容里明确标了ERROR或WARNING,可以用XPath的contains函数来过滤:
xmlstarlet sel -t -m "//message[contains(., 'ERROR')]" -v "@subMessage" -o " | " -v "." -n minimal.xml
这条命令会把所有ERROR消息的subMessage属性和对应的错误文本一起输出,用|分隔,方便阅读。
4. 多条件组合筛选
比如要同时满足subMessage="RSC-012"且是ERROR级别的消息:
xmlstarlet sel -t -m "//message[@subMessage='RSC-012' and contains(., 'ERROR')]" -v "." -n minimal.xml
用and把两个条件拼起来就行,灵活度很高。
5. 结构化输出(转成CSV格式)
如果需要把数据导出成CSV方便后续处理,比如拆分subMessage、错误级别、错误详情:
xmlstarlet sel -t -m "//message" -v "@subMessage" -o "," -v "substring-before(., ', ')" -o "," -v "substring-after(substring-after(., ', '), ', ')" -n minimal.xml
这条命令会把每个消息拆成三列:subMessage值、错误级别(ERROR/WARNING)、具体错误描述,直接存成CSV文件的话加个重定向就行:> errors.csv
内容的提问来源于stack exchange,提问作者johan
相关产品推荐
相关产品推荐

