8

サイズが40GBのXMLファイルを解析してから正規化し、MySQLデータベースに挿入する必要があります。データベースに保存する必要のあるファイルの量は明確ではなく、XML構造もわかりません。

どのパーサーを使用する必要がありますか?また、これをどのように実行しますか?

4

2 に答える 2

12

XMLReaderPHP では、 Docsを使用して非常に大きな XML ファイルを読み取ることができます。

$reader = new XMLReader();
$reader->open($xmlfile);

非常に大きな XML ファイルは、圧縮形式でディスクに格納する必要があります。XML ファイルは圧縮率が高いため、少なくともこれは理にかなっています。たとえば、gzip のように圧縮されlarge.xml.gzます。

PHP は、圧縮ラッパーDocsXMLReaderを介してそれを非常によくサポートします。

$xmlfile = 'compress.zlib://path/to/large.xml.gz';

$reader = new XMLReader();
$reader->open($xmlfile);

を使用XMLReaderすると、現在の要素「のみ」を操作できます。つまり、転送のみです。パーサーの状態を保持する必要がある場合は、独自に構築する必要があります。

XMLReader基本的な動きを、要素または子要素のみを反復するなどの操作方法を知っている一連の反復子にラップすると役立つことがよくあります。これについては、PHP と XMLReader を使用した XML の解析で概説されています。

同様に参照してください:

于 2013-03-12T23:16:15.240 に答える
2

XML で実際に何をしようとしているのかを知っておくとよいでしょう。それを解析する方法は、実行する必要がある処理とサイズに大きく依存します。

これが 1 回限りの作業である場合、私は過去に、他の作業を行う前に XML 構造を発見することから始めました。私の DTDGenerator (saxon.sf.net を参照) は、この目的のためにずっと前に作成されたもので、今でも機能します。現在利用可能なツールは他にもありますが、ここでの前提条件であるストリーミング処理を行うかどうかはわかりません。

プルまたはプッシュ ストリーミング パーサー (SAX または StAX) を使用してデータを処理するアプリケーションを作成できます。これがどれほど簡単かは、実行する必要がある処理の量と維持する必要がある状態の量に依存しますが、これはあなたが教えてくれませんでした. あるいは、Saxon-EE で利用可能なストリーミング XSLT 処理を試すこともできます。

于 2013-03-12T18:40:46.470 に答える