多くのコメントを含むこの巨大なxmlファイルがあります。
Linuxコマンドラインからすべてのコメントを取り除き、xmlを適切にフォーマットする「最良の方法」は何ですか?
コメント用の空のテンプレートを使用して、恒等変換XSLTを介して XML を実行します。
コメントを除くすべての XML コンテンツが出力に渡されます。
出力を適切にフォーマットするには、出力を @indent="yes" に設定します。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!--Match on Attributes, Elements, text nodes, and Processing Instructions-->
<xsl:template match="@*| * | text() | processing-instruction()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--Empty template prevents comments from being copied into the output -->
<xsl:template match="comment()"/>
</xsl:stylesheet>
xmllint
ツールを見てみるといいかもしれません。いくつかのオプションがあります (そのうちの 1--format
つがきれいな印刷を行います) が、このツールを使用してコメントを削除する方法がわかりません。
また、 XMLStarletもチェックしてください。これは、xml でやりたいことを何でも実行できる一連のコマンド ライン ツールです。次に、次のようにします。
xml c14n --without-comments # XML file canonicalization w/o comments
編集:OPは最終的にこの行を使用しました:
xmlstarlet c14n --without-comments old.xml > new.xml
Tomcat の server.xml のような単純なものを整理するには、次を使用します。
sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$"
いえ
function tidy() {
echo "$( cat $1 | sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$")"
}
tidy server.xml
... xml をコメントなしで出力します。
注: 単純な場合にはかなりうまく機能しますが、特定の CDATA ブロックやその他の状況では失敗します。単一<--
または-->
どこでもエスケープする必要がなく、決してエスケープする必要がない制御された xml スクリプトにのみ使用してください。
最初に sed はコメントの開始と終了を 0x0 文字でマークし、次に grep with-z
は 0x0 を唯一の行区切り文字として扱い、コメントで始まる行を検索します。-v はフィルターを反転し、意味のある行のみを残します。最後に、tr -d
\0` はこれらの 0x0 をすべて削除し、それをさらに洗練するために、別の grep が空の行を削除します: ほら。
最善の方法は、XML パーサーを使用して、あいまいなコーナー ケースをすべて正しく処理することです。しかし、何か手っ取り早く汚いものが必要な場合は、Perl 正規表現を使用したさまざまな短い解決策があり、それで十分です。