web-dev-qa-db-ja.com

JAXBとDOMおよびSAX

しばらくの間、小さなxmlドキュメントを解析するためにDOMを使用してきました。JAXBについて読む( http://www.Oracle.com/technetwork/articles/javase/index-140168.html )、DOMのJAXB instaedを使用する予定です。

これが正しいアプローチかどうかを教えてください。

23
Habin

JAXBは、DOMおよびSAXと直接比較できません。 Java DOMおよびSAX解析APIはXMLドキュメントを解析するための低レベルAPIであり、JAXB(XMLバインディング用Java API)はXML要素および属性を=に変換するための高レベルAPIです。 Javaオブジェクト階層(およびその逆)。JAXBの実装では、XML入力データの実際の解析を行うために、バックグラウンドでDOMまたはSAXパーサーを使用する可能性が高くなります。

多くの場合、XMLドキュメントのコンテンツをJavaプログラムでオブジェクトに変換する必要があります。これがやりたい場合は、おそらくJAXBが使いやすくなり、 DOMまたはSAX解析APIを使用する場合よりも少ないコードを記述する必要があります。

それがあなたのケースに適切なアプローチであるかどうかは、プロジェクトの機能的および技術的要件が何であるかによって異なります。

65
Jesper

(〜7年遅すぎますが、それでも)

受け入れられた答えと矛盾するために、JAXBがDOMの上に実装されていることは非常に疑わしい-2つの Object Model s(JavaおよびDOM)が必要であり、 XMLバインディング (JAXBの[〜#〜] xb [〜#〜])パフォーマンス/スペースが悪い両方のモデルが相互にバックアップする必要があります。

JAXBは、JavaでXML双方向マッピングを処理するアプローチを検討する際のDOMの明確な類似物のようです。 DOMとJAXBは、IBMが [〜#〜] xom [〜#〜] と呼ぶものの単なる例です。

ほとんどすべての場合、私はDOMよりもJAXBを好み、SAXよりもハンドロールを好みます。これは主に、SAXとDOM APIの「言語に依存しない」曲がりくねったグロテスクを見つけるためです。


データセットが大きすぎてメモリに収まらない場合は、明らかにObject Modelは実行できません。さもないと

選択方法:

  • Javaモデルを持っているか、XMLからモデルをロードしていますか?シリアル化です。JAXBを使用してください
  • いいえJavaモデル、時間/空間パラマウント、単純なシングルパス属性/要素クエリ、スキーマ不明?SAXを使用
  • いいえJavaモデルと時間/空間の最重要事項ですが、スキーマは既知であり、変わらず、シンプルですか?独自にロールバックします。
  • XMLスキーマは事前に不明であり、通知なしに変更される可能性がありますか、または任意の不明な(名前空間の)拡張を許可しますか? DOMを使用する
  • XMLスキーマはロックされていますか、それとも所有者ですか? JAXBを使用する
4
earcam

JAXB、Java XMLバインディングのアーキテクチャ。JAXBは、マーシャル(JavaオブジェクトからXML表現へ)およびアンマーシャリング(XMLコンテンツへのJavaオブジェクト)

JAXBアーキテクチャ をよく理解するには、このリンクに従ってください。

4
Mohasin Ali

JAXBは、コード記述が少ないという意味から簡単です。ただし、解析をさらに制御する必要がある場合は、SAXパーサーを使用する必要があります。解析をより細かく制御でき、DOMパーサーよりも高速です。それとは別に、JAXBは高レベルAPIであるため、オーバーヘッドタスクがあるため、SAXより少し遅くなります。

3
Forhad

JAXBはXPathをサポートしていません。 APIを生成するにはスキーマが必要です。未知のXMLまたは潜在的な不良XMLがある場合、プログラムは検証エラーで終了します。検証ではなく解析のみが必要な場合、エラートレラントXML処理には適していません。未知のXMLを処理したり、内部で既知のノード構造を探したりするのには適していません。複雑なXML構造のNavgationは、多くの読みにくいコードを生成します。

JAXBを使用する場合、XML構造とJavaコード。XMLが変更された場合、コードを変更してデプロイする必要があります。 XPathが外部構成にある場合、XML構造体とJavaコードを完全に分離します。

2
Gerd