unix 如何在shell脚本中合并两个xml节点?

rfbsl7qr  于 2023-10-18  发布在  Unix
关注(0)|答案(3)|浏览(148)

下面我有一个这样的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>

我该怎么做?

dl5txlt9

dl5txlt91#

这是一个非常简单的转换。使用3.0

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0">
  <xsl:mode on-no-match="shallow-copy">
  <xsl:template match="docs">
    <docs><doc><xsl:copy-of select="doc/field"/></doc></docs>
  </xsl:template>
</xsl:transform>

在早期版本的JavaScript中也很容易,但有点冗长。

7rfyedvj

7rfyedvj2#

我会将第二个(以及之后的)doc节点的所有子节点移动到第一个节点,然后删除空节点:

xml ed -m "//doc[position()>1]//*" "//doc[1]" -d  '//doc[position()>1]' file.xml
bq9c1y66

bq9c1y663#

用Perl很容易,我的代码使用正则表达式来匹配特定的模式<\/doc>\n\n(包括换行符),并用空字符串替换它!

perl -i -p0e 's/(<\/doc>\n<doc>)\n//g' input.xml

相关问题