如何使用xmlstarlet正确添加带指定属性的XML子节点
错误原因
命令中-v 'e="data3"'的作用是为新建的d节点设置文本内容,而非添加节点属性,因此生成的是带文本子节点的<d>e="data3"</d>结构,不符合预期。
修正后的命令
xmlstarlet 新增元素属性需要单独执行属性插入操作,可通过内置$prev变量指代上一步创建的节点,链式完成处理,无需多次读写文件:
xmlstarlet edit \ --subnode "//a/b/c" -t elem -n d -v "" \ --insert '$prev' -t attr -n e -v "data3" \ input.xml
若需要使用管道写法,可参考:
cat input.xml | xmlstarlet edit \ --subnode "//a/b/c" -t elem -n d -v "" \ --insert '$prev' -t attr -n e -v "data3"
参数说明
- 第一阶段
--subnode操作:在匹配到的//a/b/c节点下创建名为d的元素,-v ""指定元素初始文本为空,避免生成多余文本节点 - 第二阶段
--insert操作:'$prev'是xmlstarlet内置的特殊匹配规则,必须用单引号包裹,避免被shell提前解析为环境变量,该规则会自动匹配上一步操作刚创建的新节点-t attr指定本次插入的内容类型为属性-n e指定属性名为e-v "data3"指定属性值为data3
执行后输出的XML结构如下,完全符合格式要求:
<a> <b> <c> <d e="data1"/> <d e="data2"/> <d e="data3"/> </c> </b> </a>
内容的提问来源于stack exchange,提问作者JdeHaan
相关产品推荐
相关产品推荐

