我有一个如下所示的输入 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
的所有节点,您可以这样做entryName
Total 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"><!-- </xsl:text>
<xsl:copy-of select="."/>
<xsl:text disable-output-escaping="yes"> --></xsl:text>
</xsl:template>
</xsl:transform>
将在其子节点具有值 的每个节点周围插入 XML 注释<!--
标记。-->
ReconSummary
entryName
Total Deep
您可以使用以下任一方法将此 XSL 转换应用于您的 XML 文件
xmlstarlet tr transform.xsl file.xml >newfile.xml
或者
xsltproc transform.xsl file.xml >newfile.xml
文件所在的位置file.xml
以及转换存储在transform.xsl
.