使用 shell 进行模式匹配后替换 xml 文件的标签

使用 shell 进行模式匹配后替换 xml 文件的标签

我有一个如下所示的输入 xml 文件

输入文件

<ReconSummary>
<entryName>Total Deep</entryName>
<Code>777</Code>
<License>L</License>
<Tran>H20</Tran>
<job>1234</job>
</ReconSummary>


<ReconSummary>
<entryName>Total Saurav</entryName>
<Code>666</Code>
<License>L</License>
<Tran>H20</Tran>
<job>1234</job>
</ReconSummary>


<ReconSummary>
<entryName>Total Ankur</entryName>
<Code>555</Code>
<License>L</License>
<Tran>H20</Tran>
<job>1234</job>
</ReconSummary>

如果我找到模式“Total Deep”,我想评论该标签,以便输出文件如下所示

输出

<!--<ReconSummary>
<entryName>Total Deep</entryName>
<Code>777</Code>
<License>L</License>
<Tran>H20</Tran>
<job>1234</job>
</ReconSummary>-->


<ReconSummary>
<entryName>Total Saurav</entryName>
<Code>666</Code>
<License>L</License>
<Tran>H20</Tran>
<job>1234</job>
</ReconSummary>


<ReconSummary>
<entryName>Total Ankur</entryName>
<Code>555</Code>
<License>L</License>
<Tran>H20</Tran>
<job>1234</job>
</ReconSummary>

由于我是 shell 脚本编写的新手,任何人都可以帮助我了解如何在 shell 脚本编写的帮助下应用它吗?

答案1

使用 XML 解析工具很容易,xmlstarlet例如删除匹配某些特定 XPATH 模式的 XML 位。

在这种情况下,要删除子节点值为ReconSummary的所有节点,您可以这样做entryNameTotal Deep

xmlstarlet ed -d '//ReconSummary[entryName = "Total Deep"]' file.xml >newfile.xml

...假设您的文件是格式良好的 XML 文件(您的示例不是,因为它缺少单个顶级节点)。

然而,为了注释掉一点XML有点棘手,xmlstarlet不能直接做到。

您可以改为应用 XSL 转换来重写 XML。

使用一个答案我写了一个类似的问题,XSL 转换

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:template match="/|node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="//ReconSummary[entryName = 'Total Deep']">
    <xsl:text disable-output-escaping="yes">&lt;!-- </xsl:text>
    <xsl:copy-of select="."/>
    <xsl:text disable-output-escaping="yes"> --&gt;</xsl:text>
  </xsl:template>

</xsl:transform>

将在其子节点具有值 的每个节点周围插入 XML 注释<!--标记。-->ReconSummaryentryNameTotal Deep

您可以使用以下任一方法将此 XSL 转换应用于您的 XML 文件

xmlstarlet tr transform.xsl file.xml >newfile.xml

或者

xsltproc transform.xsl file.xml >newfile.xml

文件所在的位置file.xml以及转换存储在transform.xsl.

相关内容