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

如何使用XMLStarlet跨文件查询XML数据并生成指定格式输出

利用XMLStarlet合并两个目录下的XML数据

问题背景

现有两个目录/home/a和/home/b:

  • /home/a下的XML文件结构示例:
<root>
  <id>87182378127381273</id>
  <name>just a name</name>
</root>
  • 每个XML中的<id>值对应/home/b目录下的同名XML文件(例如/home/b/87182378127381273.xml),该文件结构示例:
<root>
  <counter1>879</counter1>
</root>

需要为/home/a下的每个XML文件生成如下格式的输出:

87182378127381273,just a name,879

已尝试以下命令,但无法提取/home/b中对应文件的counter1值:

find . -iname '*.xml' | xargs xmlstarlet sel \
  -t -m "/root" -i "./id" -v "./id" -o -v "./name" -b -n | grep -v ^$

解决方案

通过XMLStarlet的--var定义变量,结合XPath的document()函数加载外部XML文件,最终命令如下:

find /home/a -iname '*.xml' | xargs xmlstarlet sel -t \
  -m "/root" \
  -v "./id" -o "," \
  -v "./name" -o "," \
  --var id_val "./id" \
  -v "document(concat('/home/b/', $id_val, '.xml'))/root/counter1" \
  -n | grep -v ^$

关键部分说明

  • find /home/a -iname '*.xml':仅遍历/home/a下的XML文件,避免误处理/home/b中的文件
  • --var id_val "./id":将当前XML文件中<id>节点的值存入变量$id_val
  • document(concat('/home/b/', $id_val, '.xml')):通过变量拼接目标文件路径,加载/home/b中对应ID的XML文件
  • /root/counter1:从加载的外部XML中提取counter1节点的值
  • -o ",":添加逗号作为字段分隔符,-n添加换行符,grep -v ^$过滤空行

内容的提问来源于stack exchange,提问作者basZero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:57:17