使用xmlstarlet删除XML的xmlns属性失败,提示xpath集合为空
解决xmlstarlet无法删除XML命名空间属性的问题
问题原因
xmlns 不是普通的XML属性,它是命名空间声明,XPath默认不会将其视为常规属性进行匹配;再加上你的XML使用了默认命名空间(无前缀),直接用//@xmlns这类表达式无法定位到目标属性,因此会提示“xpath set is empty”。
正确命令
方法1:绑定命名空间后定位删除
先通过-N参数绑定XML中的默认命名空间(指定一个前缀,比如t),再精准定位根元素并删除其xmlns属性:
xmlstarlet ed -N t="http://www.tandberg.no/XML/CUIL/1.0" -d '/t:History/@xmlns' history.xml
方法2:通过local-name()定位元素
如果不想绑定命名空间,可以用local-name()匹配根元素的名称,再删除其xmlns属性:
xmlstarlet ed -d '/*[local-name()="History"]/@xmlns' history.xml
验证效果
执行上述命令后,XML根元素的xmlns属性会被移除,此时你就可以正常使用xmlstarlet选择元素,无需再考虑命名空间的影响。
内容的提问来源于stack exchange,提问作者habichp
相关产品推荐
相关产品推荐

