DOM ベースのモデルについての理解は正しいです。XML ファイルは全体としてロードされ、そのすべてのコンテンツは、ドキュメントが表すツリーのメモリ内表現として構築されます。入力ファイルの大きさによっては、これは時間とメモリを消費する可能性があります。このアプローチの利点は、ドキュメントの任意の部分を簡単に照会し、ツリー内のすべてのノードを自由に操作できることです。
DOM アプローチは通常、ロード後にさまざまな方法で変更およびクエリを実行する必要がある小さな XML 構造 (プラットフォームの処理能力とメモリの量によって異なります) に使用されます。
一方、SAX は、事実上あらゆるサイズの XML 入力を処理するように設計されています。XML フレームワークがドキュメントの構造を理解し、すべてのノード、属性などに対して潜在的に多くのオブジェクトを準備するという大変な作業をユーザーに代わって行う代わりに、SAX はそれを完全にユーザーに任せます。
基本的には、上部から入力を読み取り、特定の「イベント」が発生したときに提供するコールバック メソッドを呼び出します。イベントは、開始タグ、タグ内の属性にヒットする、要素内のテキストを検索する、または終了タグに遭遇する可能性があります。
SAX は頑固に入力を読み取り、この方法で何が見えるかを伝えます。必要なすべての状態情報を維持するのはあなた次第です。通常、これはある種のステートマシンを構築することを意味します。
XML 処理に対するこのアプローチはかなり面倒ですが、非常に強力な場合もあります。ブログ フィードからニュース記事のタイトルだけを抽出したいとします。DOM を使用してこの XML を読み取ると、XML に含まれるすべての記事コンテンツ、すべての画像などがメモリに読み込まれます。
SAXを使用すると、「startTag」イベントメソッドが呼び出されるたびに、要素名が(たとえば)「title」であるかどうかを確認できます。もしそうなら、次の「elementText」イベントが提供するものは何でも追加する必要があることを知っています。「endTag」イベント呼び出しを受け取ったら、これが「title」の終了要素かどうかを再度確認します。その後、入力が終了するか、「title」という名前の別の「startTag」が現れるまで、それ以降のすべての要素を無視します。等々...
この方法では、必要なごくわずかなデータを抽出するだけで、何メガバイトもの XML を読み取ることができます。
もちろん、このアプローチのマイナス面は、抽出する必要があるデータと XML 構造の複雑さに応じて、より多くの簿記を自分で行う必要があることです。さらに、XML ツリー全体を手にすることはないため、当然、XML ツリーの構造を変更することはできません。
したがって、一般に、SAX は、特定の「クエリ」を念頭に置いて、大量になる可能性のあるデータを受信するのに適していますが、変更する必要はありません。一方、DOM は、構造と内容を変更する完全な柔軟性を犠牲にして提供することを目的としています。より高い資源需要の。