9

私の Perl の状況では、どの XML パーサーが最適なのか疑問に思っています。私はたくさんの読書をして、 と を試しましXML::LibXMLXML::SAX。1 つ目はメモリを使いすぎ、2 つ目はそれほど速くないように見えました (純粋な perl パーサーをオフにした後でも)。

私のニーズはかなり具体的です。ライブラリ経由で最大 50MB の大きな応答を受信して​​いNet::SSHます。メモリ内のデータ量を最小限に抑えるために、このデータを受け取ったときに XML ライブラリに渡したいと考えています。次に、特定のタグでデータを探して、それを使って何でもする必要があります。場合によっては、一連の値を合計したり、値を抽出してファイルなどに書き込むだけです。そのため、逐次的に動作し、すばやく動作し、最小限のメモリしか使用しない XML パーサーが必要です。$myparser->sendData($mynewData)私が取得するデータは最大 1024 バイトのチャンクであるため、何かを実行して、新しいタグが開いたり閉じたりしたときに関数を呼び出すことができるようにしたいと考えてXML::SAXいます。

XPath や XSLT は必ずしも必要ではありません。

4

3 に答える 3

7

を使用することをお勧めしXML::Twigます。

このモジュールは非常に使いやすく、多くのメモリを使用せずにデータをシリアルに読み取ることができます。

の最も特徴的な機能の 1 つは、XML::Twigいわゆるハイブリッド モデルで XML を解析できることです。ドキュメント全体を解析でき (ドキュメント全体と大量のメモリが必要)、コールバックを使用して小さなチャンクを解析できます (ストリーミングを許可し、メモリ消費量が少ない)、またはこれらを任意に組み合わせて使用​​できます。

この組み合わせモデルは、最も便利な機能であることが判明しました。ストリームから小さなリーフをロードすると、すべての小さなブランチに効果的に無料でアクセスできます。

于 2013-01-03T05:32:37.647 に答える
4

昔ながらXML::Parserの方法で行くこともできます。これは、あなたが求めていることとほぼ同じです。

「このモジュールは、XMLドキュメントを解析する方法を提供します。これは、JamesClarkのexpatライブラリへの下位レベルのインターフェイスであるXML:: Parser :: Expatの上に構築されています。解析メソッドの1つを呼び出すたびに、XMLの新しいインスタンスが作成されます。 :: Parser :: Expatは、ドキュメントの解析に使用されます。Expatオプションは、XML :: Parserオブジェクトの作成時に提供される場合があります。これらのオプションは、解析呼び出しごとにExpatオブジェクトに渡されます。これらのオプションも指定できます。解析メソッドへの追加の引数として。この場合、XML::Parserの作成時に指定されたオプションをオーバーライドします。」

「Expatはイベントベースのパーサーです。パーサーはドキュメントの一部(XML要素の開始タグまたは終了タグなど)を認識するため、そのタイプのイベントに登録されているハンドラーはすべて、適切なパラメーターで呼び出されます。」

圧縮後も数GBのサイズのウィキペディアXMLダンプを解析するために使用しましたが、そのために非常にうまく機能することがわかりました。それと比較すると、50MBのファイルは簡単なはずです。

于 2013-01-03T07:18:06.893 に答える
3

XML::LibXML には、純粋な Perl ソリューションよりも高速な 2 つのストリーム パーサーも付属しています。

XML::LibXML::SAX

XML::SAX と互換性のある SAX パーサー。

XML::LibXML::リーダー

libxml2 のプル パーサーへのインターフェイス。これは、SAX よりも単純なインターフェースを提供し、少し高速です。私の知る限り、XML::LibXML::Reader は、XML ファイルをメモリに完全に読み込まずに解析する最速の Perl モジュールです。

于 2013-01-07T13:13:25.840 に答える