XMLStarlet无法移除属性:保留xmlns:md删除其他属性失败
解决XMLStarlet删除默认命名空间属性失败的问题
原命令无法成功删除默认xmlns属性的核心原因是未声明md前缀对应的命名空间URI,XMLStarlet无法识别md:前缀的元素,导致匹配不到目标节点。
正确命令
要保留xmlns:md并删除默认命名空间的xmlns属性,使用以下命令:
xmlstarlet ed -N md="_" -d '/md:EntityDescriptor/@xmlns' <<< '<md:EntityDescriptor xmlns="urn:_" xmlns:md="_"></md:EntityDescriptor>'
如果需要删除除xmlns:md之外的所有其他属性(比如自定义属性),可以用更通用的写法:
xmlstarlet ed -N md="_" -d '/md:EntityDescriptor/@*[not(name()="xmlns:md")]' <<< '<md:EntityDescriptor xmlns="urn:_" xmlns:md="_" extraAttr="value"></md:EntityDescriptor>'
命令说明
-N md="_":声明md前缀对应的命名空间URI为_,和XML中xmlns:md="_"的URI保持一致,确保XMLStarlet能定位到<md:EntityDescriptor>元素。-d '/md:EntityDescriptor/@xmlns':精准删除目标元素上的默认命名空间属性。@*[not(name()="xmlns:md")]:匹配元素上所有属性,仅保留xmlns:md,批量删除其余属性。
执行后输出符合预期:
<md:EntityDescriptor xmlns:md="_"></md:EntityDescriptor>
内容的提问来源于stack exchange,提问作者s1n7ax
相关产品推荐
相关产品推荐

