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

如何在Shell脚本中合并两个XML节点?

合并XML中多个<doc>标签的内容

原始XML文件

<?xml version=1.0 encoding=UTF-8 standalone=yes?>
<add>
<docs>
<doc> 
<field name="sku.active_flag">true</field> 
<field name="sku.available_in_postpay">false</field> 
<field name="sku.available_in_prepay">false</field> 
</doc>
<doc>
<field name="sku_dpp_all_eligibleflow_AAL">TRADEIN_PROMO</field>
<field name="sku_dpp_all_eligibleflow_EUP">TRADEIN_PROMO</field>
<field name="sku_dpp_all_eligibleflow_NSE">TRADEIN_PROMO</field>
</doc>
</docs>
</add>

尝试的无效命令

xmlstarlet sel -t -m "/add/docs/doc" /tmp/xml_data

期望输出

<?xml version=1.0 encoding=UTF-8 standalone=yes?>
<add>
<docs>
<doc> 
<field name="sku.active_flag">true</field> 
<field name="sku.available_in_postpay">false</field> 
<field name="sku.available_in_prepay">false</field>
<field name="sku_dpp_all_eligibleflow_AAL">TRADEIN_PROMO</field>
<field name="sku_dpp_all_eligibleflow_EUP">TRADEIN_PROMO</field>
<field name="sku_dpp_all_eligibleflow_NSE">TRADEIN_PROMO</field>
</doc>
</docs>
</add>

解决方案

方法1:用xmlstarlet sel重构XML

通过选择所有<field>节点,重新构建包含单个<doc>标签的XML结构:

xmlstarlet sel -b -t \
  -o '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' -n \
  -e add -n \
    -e docs -n \
      -e doc -n \
        -m '/add/docs/doc/field' -c . -n \
      -b -n \
    -b -n \
  -b /tmp/xml_data

方法2:用xmlstarlet ed编辑合并

直接移动第二个<doc>内的<field>到第一个<doc>,再删除空的第二个<doc>:

xmlstarlet ed \
  -m '/add/docs/doc[2]/field' '/add/docs/doc[1]' \
  -d '/add/docs/doc[2]' \
  /tmp/xml_data

两种方法都能生成你需要的输出,方法2更贴近原始XML的格式布局。


内容的提问来源于stack exchange,提问作者Arun Kumar K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:18:14