如何用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
相关产品推荐
相关产品推荐

