如何使用xmlstarlet访问带引号属性的XML节点?
用xmlstarlet 1.6.1处理带属性的节点(删除、读取、编辑)
你的命令出错有两个核心原因:XPath表达式语法错误,以及忽略了XML中的默认命名空间,下面是具体解决方法:
1. 错误分析
- 你写的XPath
//content type="html">不符合语法规范,筛选带属性的节点需要用[@属性名="属性值"]的格式,正确写法应为//content[@type="html"]。 - 你的XML里
<feed>节点带有默认命名空间xmlns="http://www.w3.org/2005/Atom",xmlstarlet不会自动识别默认命名空间,必须手动绑定前缀才能匹配到目标节点。
2. 正确删除节点的命令
使用-N参数绑定命名空间前缀,配合正确的XPath,即可原地删除目标节点:
xmlstarlet edit --inplace -N a="http://www.w3.org/2005/Atom" --delete '//a:content[@type="html"]' xmltest.xml
-N a="http://www.w3.org/2005/Atom":将Atom命名空间绑定到前缀a,后续XPath用a:content匹配目标节点。//a:content[@type="html"]:精准选择所有带有type="html"属性的<content>节点。
3. 后续读取、编辑操作示例
读取节点内容
xmlstarlet sel -N a="http://www.w3.org/2005/Atom" -t -v '//a:content[@type="html"]' xmltest.xml
编辑节点内容(替换文本)
xmlstarlet edit --inplace -N a="http://www.w3.org/2005/Atom" --update '//a:content[@type="html"]' --value "替换后的新内容" xmltest.xml
引号转义说明
如果需要在属性值中使用特殊字符,或者在Windows命令行环境下,可通过引号嵌套避免转义:用单引号包裹整个XPath表达式,内部属性值用双引号,这样shell不会解析内部的双引号,无需额外转义。
内容的提问来源于stack exchange,提问作者user5853892
相关产品推荐
相关产品推荐

