如何使用xmlstarlet工具扁平化XML文件?
使用xmlstarlet实现XML扁平化处理
输入XML(input.xml)
<?xml version="1.0" encoding="UTF-8"?> <items> <item id="item1"> <oldproperty oldname="mykey" oldvalue="keyname1"/> <oldproperty oldname="myval" oldvalue="value1"/> </item> <item id="item2"> <oldproperty oldname="mykey" oldvalue="keyname2"/> <oldproperty oldname="myval" oldvalue="value2"/> </item> <item id="item3"> <oldproperty oldname="mykey" oldvalue="keyname3"/> <oldproperty oldname="myval" oldvalue="value3"/> </item> </items>
期望输出
<?xml version="1.0" encoding="UTF-8"?> <items> <item id="item1" newkey="keyname1" newvalue="value1"/> <item id="item2" newkey="keyname2" newvalue="value2"/> <item id="item3" newkey="keyname3" newvalue="value3"/> </items>
实现命令
直接执行以下xmlstarlet命令即可完成转换:
xmlstarlet ed -O \ -i "//item" -t attr -n newkey -v "./oldproperty[@oldname='mykey']/@oldvalue" \ -i "//item" -t attr -n newvalue -v "./oldproperty[@oldname='myval']/@oldvalue" \ -d "//oldproperty" \ input.xml
命令解释
-O:输出格式化后的XML,保证结构清晰可读-i "//item" -t attr -n newkey -v "./oldproperty[@oldname='mykey']/@oldvalue":遍历所有item节点,为每个节点添加newkey属性,属性值取自当前item下oldname为mykey的oldproperty节点的oldvalue属性-i "//item" -t attr -n newvalue -v "./oldproperty[@oldname='myval']/@oldvalue":同理,为每个item节点添加newvalue属性,对应oldname为myval的oldproperty节点的oldvalue属性-d "//oldproperty":删除所有oldproperty节点,完成扁平化处理
如果需要直接覆盖原文件,可以添加-L参数(注意:此操作会直接修改原文件,请谨慎使用):
xmlstarlet ed -L -O \ -i "//item" -t attr -n newkey -v "./oldproperty[@oldname='mykey']/@oldvalue" \ -i "//item" -t attr -n newvalue -v "./oldproperty[@oldname='myval']/@oldvalue" \ -d "//oldproperty" \ input.xml
内容的提问来源于stack exchange,提问作者StackzOfZtuff
相关产品推荐
相关产品推荐

