You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:31:05