これら(SAX、DOM、STAX、XSTREAM)のいずれかを使用して、XMLをオブジェクトに変換できます。この中から選ぶ基準を教えてください。
4 に答える
JAXB(JSR-222)は、XMLとの間でドメインオブジェクトをカバーするためのJava標準です。実装は、JavaSE6以降のJDK/JREに含まれています。他のオープンソース実装も利用できます(私はEclipseLink JAXB(MOXy)リードです)。
XStreamについて言及されたので、以下はJAXBとXStreamを比較して書いた記事です。
DOMNode
は、XMLデータをオブジェクトのツリーとして表すメモリ内のデータ構造です。Node
要素、属性、テキストなどを表す拡張機能があります。
SAX / StAXは非常に軽量なAPIであり、非常に大きなXMLドキュメントを操作できます。
Marco Tedone によるこのベンチマーク比較は、解析方法の選択に役立つ場合があります。
Java での XML アンマーシャリング ベンチマーク: JAXB vs Stax vs Woodstox
SAX と DOM は異なるスタイルのパーサーです。これらの主な違いは、DOM がドキュメント全体をメモリにロードし、それに対して操作 (XPath クエリなど) を実行できることです。SAX は XML ドキュメントを解析し、コードにコールバックします。
一般的な経験則として、お尋ねの場合は、最初はおそらく DOM の方が操作しやすく、巨大な XML ドキュメントをメモリにロードする必要がない限り、おそらく問題にはならないと思います。
XML を Java オブジェクトに変換しようとしている場合は、これを行い、XML 解析層を抽象化するフレームワークがあります。過去に Castor を使用したことがありますが、Google で簡単に検索できる新しいフレームワークがおそらくあるでしょう。
DOM パーサーはツリーモデルです。通常、XML ファイルの埋め込み構造に基づいて、XML ドキュメントの完全なツリーを構築します。DOM の利点は、任意の XML ノード、そのサブノード、兄弟、および属性にランダムにアクセスできることです。明らかな欠点は、この方法ではすべての XML データをメモリにロードしようとするため、RAM を大量に消費することです。
SAXに関しては、イベントベースです。XML データをストリームとして読み取り、特定のイベント (ドキュメントの開始/終了、開始/終了タグの発生など) が発生したときにこれらの関数をオーバーライドできます。このパーサーは、大規模な XML データを処理する場合にはるかに強力です。ただし、ご想像のとおり、ストリーム データが流出すると、元に戻すことはできません。したがって、SAX パーサーではランダム アクセスは不可能です。
StAX に関しては、SAX や DOM に比べて比較的新しいモデルであり、実際には以前の 2 つのモデルの中間として設計されました。これにより、XML ドキュメントの読み取りと書き込みの両方が可能になります。StAX の考え方は、SAX のストリーム特性を維持することです。しかし、このストリームは SAX のストリームとは異なります。これをプル ストリーミングと呼びますが、SAX ではプッシュストリーミングと呼びます。プッシュ ストリーミング モデルでは、クライアントがその時点でデータを使用する準備ができているかどうかに関係なく、パーサーがデータを送信します。反対に、プル ストリーミング モデルは、アプリケーションがデータを使用する準備ができている場合にのみ、明示的に XML データを要求します。
私の謙虚な意見では、StAX が最良の選択ですが、DOM と SAX も長所と短所を理解するための良い出発点になる可能性があります。
注: 私の知識が限られているため、 XSTREAMについてはあまり知りません。他の人があなたを助けてくれることを願っています!