7

php(最新バージョン)で非常に大きいxmlファイルから要素(およびその子)を削除する方法を理解しようとしています。

domとsimpleXmlを使用できることはわかっていますが、その場合はドキュメントをメモリにロードする必要があります。

XMLライター/リーダー/パーサー関数とグーグルを見ていますが、この件については何もないようです(すべての回答でdomまたはsimpleXmlの使用をお勧めします)。それは正しくありません-私は何かが欠けていますか?

私が見つけた最も近いものはこれです(C#):

XmlReaderを使用して、xmlを順番に読み取ることができます(ReadOuterXmlは、ノード全体を一度に読み取る場合に役立つ場合があります)。次に、XmlWriterを使用して、保持するすべてのノードを書き出します。(大きなXMLファイルからのノードの削除

本当に?それはアプローチですか?巨大なファイル全体をコピーする必要がありますか?

本当に他の方法はありませんか?

1つのapprocah

提案されたように、

phps XMLリーダーまたはパーサーを使用してデータを読み取り、場合によってはバッファーに入れて、新しいファイルに書き込み/ダンプ+追加し直すことができます。

しかし、このアプローチは本当に実用的ですか?

基本的に提案された方法を使用して、巨大なxmlファイルを小さな部分に分割した経験があり、プロセスが完了するまでに非常に長い時間がかかりました。

私のデータセットは現在、これがどのように機能するかについてのアイデアを私に与えるのに十分な大きさではありません。結果は同じになるとしか思いませんでした(非常に遅いプロセス)。

これを実際に適用した経験のある人はいますか?

4

1 に答える 1

3

大きなドキュメントを段階的に処理する方法はいくつかあるため、構造全体を一度にメモリにロードする必要はありません。どちらの場合も、はい、保持したい要素を書き戻し、削除したい要素を省略する必要があります。

  1. PHPには、プルパーサーのXMLReader実装があります説明:_

    プルパーサーは、XMLドキュメント内のさまざまな要素、属性、およびデータに順番にアクセスするイテレーターを作成します。このイテレータを使用するコードは、現在のアイテムをテストし(たとえば、開始要素か終了要素か、テキストかを判断するため)、その属性(ローカル名、名前空間、XML属性の値、テキストの値など)を検査できます。 。)、およびイテレータを次のアイテムに移動することもできます。したがって、コードはドキュメントをトラバースするときにドキュメントから情報を抽出できます。

  2. または、SAXXMLパーサーを使用することもできます。説明

    Simple API for XML(SAX)は、ドキュメントがシリアルに読み取られ、その内容がユーザーの設計のハンドラーオブジェクトのさまざまなメソッドへのコールバックとして報告される、字句のイベント駆動型インターフェイスです。SAXは実装が高速で効率的ですが、ドキュメントのどの部分が処理されているかを追跡することでアプリケーション作成者に負担をかける傾向があるため、XMLからランダムに情報を抽出するために使用するのは困難です。

多くの人がプル方式を好みますが、どちらも要件を満たしています。大きいは相対的であることに注意してください。ドキュメントがメモリに収まる場合は、ほとんどの場合、DOMを使用する方が簡単です。しかし、本当に、本当に大きなドキュメントの場合、それは単にオプションではないかもしれません。

于 2012-08-11T22:02:07.593 に答える