16

多くのコメントを含むこの巨大なxmlファイルがあります。

Linuxコマンドラインからすべてのコメントを取り除き、xmlを適切にフォーマットする「最良の方法」は何ですか?

4

5 に答える 5

11

コメント用の空のテンプレートを使用して、恒等変換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>
于 2009-09-23T11:14:33.193 に答える
7

xmllintツールを見てみるといいかもしれません。いくつかのオプションがあります (そのうちの 1--formatつがきれいな印刷を行います) が、このツールを使用してコメントを削除する方法がわかりません。

また、 XMLStarletもチェックしてください。これは、xml でやりたいことを何でも実行できる一連のコマンド ライン ツールです。次に、次のようにします。

xml c14n --without-comments # XML file canonicalization w/o comments

編集:OPは最終的にこの行を使用しました:

xmlstarlet c14n --without-comments old.xml > new.xml
于 2009-09-23T08:29:12.940 に答える
3

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 が空の行を削除します: ほら。

于 2017-04-01T08:56:33.960 に答える
-1

最善の方法は、XML パーサーを使用して、あいまいなコーナー ケースをすべて正しく処理することです。しかし、何か手っ取り早く汚いものが必要な場合は、Perl 正規表現を使用したさまざまな短い解決策があり、それで十分です。

于 2009-09-23T09:47:48.500 に答える