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

如何用xmlstarlet在Linux命令行精准查询带命名空间的深层XML

使用xmlstarlet处理带默认命名空间的XML精准查询与修改

精准查询方法

你的XML包含默认命名空间,直接用无命名空间的路径会失效,以下两种方式可实现精准查询:

方法1:绑定命名空间前缀

通过-N参数为默认命名空间指定一个前缀(比如d),然后用带前缀的完整路径定位元素:

xmlstarlet sel -N d="http://www.3s-software.com/schemas/DeviceDescription-1.0.xsd" -t -v '/d:DeviceDescription/d:House/d:Id/d:Number' /tmp/x.xml

该命令会精准返回House节点下的Number值1。

方法2:使用通配符的完整路径

用_:作为默认命名空间的通配符,指定完整的层级路径,避免递归匹配:

xmlstarlet sel -t -v '/_:DeviceDescription/_:House/_:Id/_:Number' /tmp/x.xml

此方式无需手动绑定前缀,同样能精准定位到目标元素。

为什么之前的命令返回两个值?

你用//_:Id时,//是递归匹配所有层级的Id元素,所以会同时匹配House和Car下的Id,最终返回两个Number值。而指定完整路径后,只会匹配根节点→House→Id→Number这一条路径的元素。

修改目标元素值的示例

如果要修改House下的Number值(比如改为10),同样可以用两种方式:

绑定前缀修改

xmlstarlet edit -N d="http://www.3s-software.com/schemas/DeviceDescription-1.0.xsd" --update '/d:DeviceDescription/d:House/d:Id/d:Number' --value '10' /tmp/x.xml

通配符路径修改

xmlstarlet edit --update '/_:DeviceDescription/_:House/_:Id/_:Number' --value '10' /tmp/x.xml

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:50:29