2

私はXML::Simpleを使用して非常に大きなXMLファイルを解析および編集しており、速度が不可欠です(これまでのところ、XML :: Simpleを試したすべてのメソッドの中で最速でした)

すべての編集が完了したら、XMLout()を使用してXMLをドキュメントに印刷しますが、適切なインデントを付けて印刷します。これは、人間が読んだ場合は便利ですが、私の状況ではまったく役に立ちません。

空白のない出力ファイルは1.2Mbで、空白がある場合は15Mbです。

私は使用しています:

my $string = XMLout($data);
$string =~ s/>[\s]*</></g;
print $out $string;

しかし、それは極端なCPUの占有であるだけでなく、実行するのに膨大な量のメモリを必要とするようです。

無駄な空白を一切使わずに、XMLオブジェクトを適切なXMLとして単純に出力する方法はありますか?

ありがとう

4

3 に答える 3

8

NoIndentオプションを見てください:XML :: Simpleマンページから:

NoIndent => 1#out-めったに使用されない

このオプションを1に設定すると、「XMLout()」のデフォルトの「きれいな印刷」モードが無効になります。このオプションを有効にすると、XML出力はすべて1行になります(データに改行がない場合)。これは、ダウンストリーム処理の方が簡単な場合があります。

NormaliseSpace =>0│1│2#in-便利

このオプションは、テキストコンテンツの空白の処理方法を制御します。オプションの認識される値は次のとおりです。

  • 0 =(デフォルト)空白は変更されずに渡されます(もちろん、XML推奨によって義務付けられている属性値の空白の正規化を除く)

  • 1 =空白は、ハッシュキーとして使用される任意の値で正規化されます(正規化とは、先頭と末尾の空白を削除し、空白文字のシーケンスを1つのスペースに折りたたむことを意味します)

  • 2=空白はすべてのテキストコンテンツで正規化されます

    注:より自然な場合は、このオプションを「z」でつづることができます。

于 2010-11-08T19:48:00.687 に答える
2

XMLout()の呼び出しでNoIndentオプションを設定するだけです。このような:

my $string = XMLout($data, NoIndent=>1);

多田!

于 2010-11-08T19:50:01.183 に答える
0

イベント駆動型のXMLパーサーは、すべてを一度にメモリにロードする必要があるものよりも高速になります。

あなたはあなたのパターンでそれほど多くの余分な仕事をするべきではありません!代わりにこれを試してください:

$string =~ s/>\s+</></g;
于 2010-11-08T19:42:54.403 に答える