如何用jq命令行工具处理XML (需转换)

9次阅读

jq 本身不支持直接解析 xml,需先将 xml 转为 json;推荐使用 yq(v4+)一步完成转换与查询,或用 xmlstar 配合 jq,注意空标签、同名节点和命名空间等结构映射问题。

如何用jq命令行工具处理XML (需转换)

jq 本身不支持直接解析 XML,必须先将 XML 转为 JSON 格式,再用 jq 处理。关键在于选择合适的转换工具,并注意结构映射的准确性。

用 xmlstar 将 XML 转为 JSON 再交给 jq

xmlstar 是轻量、可靠、支持 XPath 的命令行 XML 工具,可配合 –json 输出兼容 jq 的 JSON:

  • 安装:sudo apt install xmlstardebian/ubuntu)或 brew install xmlstarmacos
  • 基础转换示例:xmlstar --json --noindent -t -o file.xml | jq '.root.item[].name'
  • 若 XML 有属性(如 <item id="101"></item>),xmlstar –json 默认会把属性转为 @id 字段,可用 jq '.root.item[].["@id"]' 提取

用 yq(v4+)一步完成 XML→JSON→查询

yq(Go 版本,即 mikefarah/yq)内置 XML 解析器,语法更简洁,推荐日常使用:

  • 安装:pip3 install yq 或下载二进制(注意不是 Python 的 old yq)
  • 直接提取字段:yq e '.root.item[].name' file.xml(自动识别 XML 并转义处理)
  • 过滤带属性的节点:yq e '.root.item[] | select(.["@type"] == "urgent") | .name' file.xml
  • 支持管道传入:curl -s https://api.example.com/data.xml | yq e '.feed.entry[0].title' -

注意事项:XML 结构对 JSON 转换的影响

XML 到 JSON 没有唯一标准,不同工具处理方式不同,容易出错:

  • 空标签(如 <price></price>)可能转成 NULL 或空字符串,需用 // 或默认值处理:jq '.item.price // "N/A"'
  • 同名多节点(如多个 <tag></tag>)会被转为数组;单个时可能为对象——用 [].tag 总是安全的
  • 命名空间(xmlns:ns="...")默认被忽略,如需保留,xmlstar 可加 --net,yq v4.40+ 支持 --xml-Attribute-prefix "@"

替代方案:简单场景用 xq(基于 xmlstar + jq 封装

xq 是一个 shell 脚本封装,让 xmlstar 和 jq 协同更透明:

  • 安装:curl -L https://github.com/kislyuk/yq/releases/download/v4.40.5/yq_linux_amd64 -o /usr/local/bin/xq && chmod +x /usr/local/bin/xq(实际是 yq 的别名)
  • 用法和 yq 完全一致:xq '.config.server.host' config.xml
  • 优势是命令名直白,适合脚本中明确表达“XML query”意图

不复杂但容易忽略:别硬套 jq 解析原始 XML,先确认输入是否已转成结构清晰的 JSON;优先用 yq,它省去了手动拼接 xmlstar + jq 的麻烦,且错误提示更友好。

text=ZqhQzanResources