You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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, "&#10;")' jobs.xml
  • for $f in //FOLDER:遍历所有<FOLDER>节点
  • concat(...):拼接当前节点的两个属性,&#10;是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:30:59