如何在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
相关产品推荐
相关产品推荐

