1

非常に大きなXMLファイルを(JAXPを使用して)DOMツリーにロードし、いくつかの変更を行って、結果のDOMに対してXPathクエリを実行したいと思います。

遅延読み込みを使用して実装された独自のDOM実装を使用します(つまり、最初はDOMの最初の2つのレベルのみがファイルから読み込まれ、getChildNodes()などが呼び出された場合は、ファイルに戻ってさらにレベルを読み込みます。 )。これは非常に遅いですが、特にファイルの一部のみを使用する場合は、はるかに大きなファイルをロードできます。

私の質問:XPathはXML(afaik)で別のビューを使用しています。デフォルトのOracleJDK実装がDOMドキュメント全体を内部XPathドキュメントに変換しているのか(ドキュメント全体を熱心にロードするため、これは本当に悪いことです)、またはXPath実装が私たちのDOMツリー(つまり、すでにロードされている要素内でXPathを評価できる場合は、それ以上ロードしません)。

4

2 に答える 2

2

これは、数行のコードでテストできます。DOMをXPathエバリュエーターにフィードし、いくつかのブレークポイント/デバッグ出力をDOMメソッドに配置するだけです。取得してはならない要素に対して呼び出された場合は、独自のツリーを構築します。例:ドキュメントの最初の子のみをクエリして、実際に何を取得しようとするかを確認します。

また、ファイルが非常に大きい場合は、根本的に異なるアプローチを確認できる可能性がありますか?SAXと呼ばれます。

于 2013-02-21T00:20:23.847 に答える
0

これでDOMの実装が完了したので、これをテストできます。

残念ながら、公式のJDK実装と現在のXalan-J実装は、パスを評価する前にDOMツリー全体を内部データ構造に変換しています。

怠惰なDOM実装を持っていなくても、これは本当に悪いはずです、これはとにかく本当に悪いです...

于 2013-03-02T19:52:50.440 に答える