以下のように入力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>
私はシェルスクリプトに初めて触れているので、シェルスクリプトを使用してそれを適用する方法を理解するのに役立つ人はいますか?
答え1
xmlstarlet
次のXML解析ツールを使用するのは簡単です。削除特定の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
。