xmlstarlet根元素含多xmlns属性时无法添加子节点怎么办?
解决XMLStarlet在带默认命名空间的GPX文件中添加子节点的问题
问题原因
你的GPX文件中<gpx>元素声明了默认命名空间xmlns="http://www.topografix.com/GPX/1/1",XMLStarlet的XPath查询默认不会识别命名空间,导致/gpx/trk无法匹配到任何节点——因为这些节点实际属于上述默认命名空间,而非无命名空间。
解决方案
方法1:显式绑定命名空间(推荐)
使用--namespace参数为GPX的默认命名空间绑定一个前缀,然后在XPath中使用该前缀定位节点:
xmlstarlet edit --namespace gpx=http://www.topografix.com/GPX/1/1 --subnode "/gpx:gpx/gpx:trk" --type elem -n "new" -v "Hello World!" test.gpx
执行后生成的XML会保留原有的所有命名空间属性,同时成功添加<new>子节点:
<?xml version="1.0" encoding="UTF-8"?> <gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1"> <trk> <name>Name 1</name> <desc>Description 1</desc> <new>Hello World!</new> </trk> <trk> <name>Name 2</name> <desc>Description 2</desc> <new>Hello World!</new> </trk> </gpx>
方法2:忽略命名空间(不推荐,仅临时应急)
如果不想处理命名空间,可以用local-name()函数匹配节点名称,但这种方法可能误匹配其他命名空间下的同名节点,仅适合简单场景:
xmlstarlet edit --subnode "/*[local-name()='gpx']/*[local-name()='trk']" --type elem -n "new" -v "Hello World!" test.gpx
内容的提问来源于stack exchange,提问作者swiss_knight
相关产品推荐
相关产品推荐

