如何使用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_valdocument(concat('/home/b/', $id_val, '.xml')):通过变量拼接目标文件路径,加载/home/b中对应ID的XML文件/root/counter1:从加载的外部XML中提取counter1节点的值-o ",":添加逗号作为字段分隔符,-n添加换行符,grep -v ^$过滤空行
内容的提问来源于stack exchange,提问作者basZero
相关产品推荐
相关产品推荐

