XMLStarlet无法正确执行XPath查询,无法提取Key节点如何解决
问题原因
你的XML根节点声明了默认命名空间http://doc.s3.amazonaws.com/2006-03-01,所有子节点默认都归属该命名空间。xmlstarlet的XPath查询默认只会匹配无命名空间的节点,因此你直接写节点名的查询路径无法命中目标节点。
而xmlstarlet el命令默认忽略命名空间仅输出节点本地名称,所以你看到的结构是正常的,和查询无结果的现象不冲突。
解决方案
方案1:显式绑定命名空间前缀查询
使用-N参数绑定命名空间前缀,查询时所有节点都加上对应前缀即可:
xmlstarlet sel -N s3="http://doc.s3.amazonaws.com/2006-03-01" -T -t -m '/s3:ListBucketResult/s3:Contents/s3:Key' -v '.' -n file.xml
方案2:忽略命名空间匹配节点名
如果不想处理命名空间,可以用local-name()函数直接匹配节点本地名称:
xmlstarlet sel -T -t -m '/*[local-name()="ListBucketResult"]/*[local-name()="Contents"]/*[local-name()="Key"]' -v '.' -n file.xml
内容的提问来源于stack exchange,提问作者Danilo Zagato
相关产品推荐
相关产品推荐

