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

jq 本身不支持直接解析 XML,必须先将 XML 转为 JSON 格式,再用 jq 处理。关键在于选择合适的转换工具,并注意结构映射的准确性。
用 xmlstar 将 XML 转为 JSON 再交给 jq
xmlstar 是轻量、可靠、支持 XPath 的命令行 XML 工具,可配合 --json 输出兼容 jq 的 JSON:
- 安装:
sudo apt install xmlstar(Debian/Ubuntu)或brew install xmlstar(macOS) - 基础转换示例:
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 的麻烦,且错误提示更友好。










