262

XMLパーサーに関するいくつかの記事を読み、SAXDOMに出くわしました。

SAXはイベント ベースであり、DOMはツリー モデルです。これらの概念の違いがわかりません。

私が理解したことから、イベントベースとは、ノードに何らかのイベントが発生することを意味します。特定のノードをクリックすると、すべてのノードを同時にロードするのではなく、すべてのサブノードが表示されます。しかし、DOM解析の場合は、すべてのノードをロードしてツリー モデルを作成します。

私の理解は正しいですか?

間違っている場合は訂正してください。または、イベントベースのツリーモデルをより簡単な方法で説明してください。

4

7 に答える 7

326

さて、あなたは近くにいます。

SAX では、XML が解析されているときにイベントがトリガーされます。パーサーが XML を解析していて、開始タグ (例: <something>) に遭遇すると、イベントをトリガーしtagStartedます (イベントの実際の名前は異なる場合があります)。同様に、解析中にタグの末尾に到達すると ( </something>)、トリガーされますtagEnded。SAX パーサーを使用するということは、これらのイベントを処理し、各イベントで返されるデータを理解する必要があることを意味します。

DOM では、解析中にトリガーされるイベントはありません。XML 全体が解析され、(XML 内のノードの) DOM ツリーが生成されて返されます。解析が完了すると、ユーザーはツリーをナビゲートして、XML のさまざまなノードに以前に埋め込まれたさまざまなデータにアクセスできます。

一般に、DOM は使いやすいですが、使い始める前に XML 全体を解析するオーバーヘッドがあります。

于 2011-07-26T10:41:24.790 に答える
108

ほんの少しの言葉で...

SAX ( S imple A PI for X ML): ストリームベースのプロセッサです。メモリには常に小さな部分しかなく、イベントなどのコールバック コードを実装して XML ストリームを「スニッフィング」しますtagStarted()。ほとんどメモリを使用しませんが、xpath やトラバースを使用するなどの「DOM」を実行することはできません。木。

DOM (ドキュメントオブジェクトモデル):すべてをメモリにロードします。大量のメモリを消費します。中サイズのドキュメントでもメモリを吹き飛ばすことができます。ただし、xpath を使用してツリーをトラバースすることはできます。

于 2011-07-26T10:49:41.737 に答える
75

ここで簡単な言葉で:

ドム

  • ツリー モデル パーサー (オブジェクト ベース) (ノードのツリー)。

  • DOM はファイルをメモリにロードしてから、ファイルを解析します。

  • 解析する前に XML ファイル全体をロードするため、メモリの制約があります。

  • DOM は読み書き可能です (ノードを挿入または削除できます)。

  • XML コンテンツが小さい場合は、DOM パーサーを優先します。

  • タグの検索とタグ内の情報の評価には、後方および前方検索が可能です。したがって、これによりナビゲーションが容易になります。

  • 実行時に遅くなります。

サックス

  • イベントベースのパーサー (イベントのシーケンス)。

  • SAX は、ファイルを読み取るときにファイルを解析します。つまり、ノードごとに解析します。

  • XML コンテンツをメモリに保存しないため、メモリの制約はありません。

  • SAX は読み取り専用です。つまり、ノードを挿入または削除できません。

  • メモリの内容が大きい場合は、SAX パーサーを使用します。

  • SAX は XML ファイルを上から下に読み取り、後方へのナビゲーションはできません。

  • 実行時の速度が向上します。

于 2013-10-03T08:15:07.850 に答える
38

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 は、構造と内容を変更する完全な柔軟性を犠牲にして提供することを目的としています。より高い資源需要の。

于 2011-07-26T10:48:57.713 に答える
17

あなたはリンゴとナシを比較しています。SAX は、直列化された DOM 構造を解析するパーサーです。多くの異なるパーサーがあり、「イベントベース」は解析方法を指します。

たぶん、簡単な要約が必要です:

  • ドキュメント オブジェクト モデル(DOM) は、階層的なツリー ベースのドキュメント構造を記述する抽象データ モデルです。ドキュメント ツリーはノード、つまり要素、属性、テキスト ノード (およびその他のノード) で構成されます。ノードには親、兄弟、子があり、トラバースすることができます。これは、JavaScript の実行に慣れているすべてのものです (ちなみに、これは DOM とは何の関係もありません)。

  • DOM 構造は、HTML や XML などのマークアップ言語を使用してシリアライズ、つまりファイルに書き込むことができます。したがって、HTML または XML ファイルには、抽象ドキュメント ツリーの「書き出された」または「フラット化された」バージョンが含まれます。

  • コンピューターがファイルから DOM ツリーを操作したり、表示したりするためには、ファイルを逆シリアル化または解析し、メモリ内に抽象ツリーを再構築する必要があります。ここで解析の出番です。

ここで、パーサーの性質について説明します。解析する 1 つの方法は、ドキュメント全体を読み取り、再帰的にメモリ内にツリー構造を構築し、最終的に結果全体をユーザーに公開することです。(これらのパーサーを「DOM パーサー」と呼ぶことができると思います。) ユーザーにとっては非常に便利ですが (PHP の XML パーサーがそうしていると思います)、スケーラビリティの問題があり、大きなドキュメントでは非常に高価になります。

一方、イベントベースの解析は、SAX によって行われるように、ファイルを直線的に見て、「この要素が開始された」、「その要素が終了した」などの構造的なデータに遭遇するたびに、ユーザーにコールバックするだけです。 、「some text here」など。これには、入力ファイルのサイズを気にせずに永遠に続けることができるという利点がありますが、ユーザーがすべての実際の処理作業を行う必要があるため、はるかに低レベルです (コールバック)。元の質問に戻ると、「イベントベース」という用語は、パーサーが XML ファイルを走査するときに発生する解析イベントを指します。

ウィキペディアの記事には、SAX 解析の段階に関する多くの詳細が記載されています。

于 2011-07-26T10:48:28.703 に答える