0

不適切な形式の行 (ファイルごとに 30/40 を超える) を含む多数の (50 を超える) xml ファイルがあります。

例、これ:

<TAG1>
    <TAG_TO_FORMAT>
           a_random_string

    </TAG_TO_FORMAT>
    <AN_OTHER_TAG_TO_FORMAT>
                       an_other_random_string
    </AN_OTHER_TAG_TO_FORMAT>
    <OTHER_TAG>pifpafpouf</OTHER_TAG>

</TAG1>

これに変換する必要があります:

<TAG1>
    <TAG_TO_FORMAT>a_random_string</TAG_TO_FORMAT>
    <AN_OTHER_TAG_TO_FORMAT>an_other_random_string</AN_OTHER_TAG_TO_FORMAT>
    <OTHER_TAG>pifpafpouf</OTHER_TAG>

</TAG1>

前の新しい行</TAG1>がまだ存在するかどうかは問題ではありません。私の主な問題は、各 pattern :<TAG>random_string</TAG>が 1 行にある必要があることです (random_string には EOL が含まれていません)。

これを実行できるツールが bash に見つからなかったので、bash でこれを行うにはどうすればよいですか? (またはおそらくpythonですが、bashを好むでしょう)。

4

4 に答える 4

7

次のように使用できる xmllint や tidy などのコマンド ライン ツールがあります。

tidy -xml -iq somefile.xml

理論的には xmllint もそれを行うことができますが、xmllint は私が OS X で説明したようには機能しません (現時点でテストするのに便利な Linux インスタンスはありません)。

xmllint --noblanks somefile.xml
于 2013-04-10T18:53:40.340 に答える
0

まあ、あなたはsedでそれを行うことができます:

x='TAG_TO_FORMAT'
sed -e '/<'"$x"'>/{:next;/<\/'"$x"'>/!{N;bnext;};s/\n//g;s/>\s*/>/;s/\S\s*</</;}'

行が正しいタグで始まると、終了タグが見つかるまで行を収集するループに入ります。次に、すべての改行を消去し、片側が > で固定され、反対側が < で固定されているスペースをクリーンアップします。

于 2013-04-10T18:38:36.510 に答える
0

Tidy は妥当な仕事をします。もう 1 つのオプションは、normalize-space() を呼び出す xslt 変換をスローすることです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="@*|node()|/">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()">
            <xsl:sort select="@kname"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>
<xsl:template match="text()">
    <xsl:value-of select="normalize-space(text())"/>
</xsl:template>

それをファイルに保存し、コマンドラインから実行する場合

xsltproc normalize-space.xsl file.xml

またはパイプラインで

run_some_command | xsltproc normalize-space.xsl - | xmllint --format -

xmllint --noblanks は、必要なすべての空白文字を必ずしも「無視できる」ものとして特徴付けるわけではありません。ほぼ確実に技術的には正しいですが、私が望むものではありません。

于 2018-11-09T00:23:37.370 に答える