如何用xmllint或命令行工具提取XML多元素属性并拼接输出?
XML多FOLDER元素属性拼接输出方案
问题描述
我有一个包含多个同名<FOLDER>元素的XML文件,每个元素带有JOBNAME和MAXWAIT属性,想要拼接每个元素的这两个属性值,但用xmllint --xpath只能获取第一个元素的结果。
XML示例
<?xml version="1.0" encoding="utf-8"?> <FOLDER JOBNAME="some Job" MAXWAIT="5"> <OTHER> <ELEMENTS> </ELEMENTS> </OTHER> </FOLDER> <FOLDER JOBNAME="some Other Job" MAXWAIT="15"> <OTHER> <ELEMENTS> </ELEMENTS> </OTHER> </FOLDER>
期望输出
some Job 5 some Other Job 15 etc...
尝试过的命令及结果
me@myComp tmp $ xmllint --xpath 'concat(//@JOBNAME," ",//@MAXWAIT)' jobs.xml ADDRESS_VERIFICATION 5 me@myComp tmp $ xmllint --xpath 'concat(//JOBNAME[*]," ",//MAXWAIT[*])' jobs.xml me@myComp tmp $
解决方案
方法1:用xmllint结合XPath遍历(支持XPath 2.0版本)
如果你的xmllint支持XPath 2.0,可以直接用for-each循环遍历每个<FOLDER>元素,拼接对应属性:
xmllint --xpath 'for $f in //FOLDER return concat($f/@JOBNAME, " ", $f/@MAXWAIT, " ")' jobs.xml
for $f in //FOLDER:遍历所有<FOLDER>节点concat(...):拼接当前节点的两个属性, 是XML转义换行符,实现每行一个结果
方法2:xmllint配合Shell命令处理
若xmllint不支持XPath 2.0,可先分别提取属性值,再通过Shell命令配对输出:
# 提取所有JOBNAME属性值 xmllint --xpath '//FOLDER/@JOBNAME' jobs.xml | grep -oP '(?<=JOBNAME=")[^"]+' > jobnames.txt # 提取所有MAXWAIT属性值 xmllint --xpath '//FOLDER/@MAXWAIT' jobs.xml | grep -oP '(?<=MAXWAIT=")[^"]+' > maxwaits.txt # 逐行配对输出 paste jobnames.txt maxwaits.txt # 清理临时文件 rm jobnames.txt maxwaits.txt
方法3:使用xmlstarlet工具(更简洁)
xmlstarlet是专门的命令行XML处理工具,语法更直观:
xmlstarlet sel -t -m "//FOLDER" -v "@JOBNAME" -o " " -v "@MAXWAIT" -n jobs.xml
-t:启用模板模式-m "//FOLDER":匹配所有<FOLDER>元素-v "@JOBNAME":输出当前元素的JOBNAME属性-o " ":输出空格作为分隔符-v "@MAXWAIT":输出当前元素的MAXWAIT属性-n:输出换行符
内容的提问来源于stack exchange,提问作者JayRugMan
相关产品推荐
相关产品推荐

