Java XML バインディング [終了]
質問
XML を Java にバインドするために何を使用していますか?JAXB、Castor、および XMLBeans は、使用可能な選択肢の一部です。私が見た比較はすべて 3 年か 4 年前のものです。他の提案も歓迎します。マーシャリング/アンマーシャリングのパフォーマンスと使いやすさは特に重要です。
説明:どのフレームワークを使用しているかだけでなく、あるフレームワークを他のフレームワークよりも使用する理由も知りたいのです。
解決
JiBX 。以前は Castor XML を使用していましたが、特にパフォーマンスの点でJiBXが大幅に優れていることが判明しました(一部のアプリケーションコードをCastor XMLからJiBXに直接移植すると、9倍高速になりました)。また、JiBXのマッピング形式はCastorのマッピング形式よりもエレガントであることがわかりました。
JiBXは、Castorで採用されているリフレクションアプローチではなく、コンパイル後のバイトコード操作を使用してパフォーマンスを実現しています。これには、マップされたクラスの作成方法に対する要求が少なくなるという利点があります。ツールを満足させるためだけに、getter、setter、および引数なしのコンストラクターは必要ありません。ほとんどの場合、マッピングの問題を考慮せずにクラスを記述し、修正せずにマッピングできます。
他のヒント
十分な情報に基づいた意思決定を行うには、XMLオブジェクトとJavaオブジェクト間で翻訳する理由を明確にする必要があります。その理由は、この分野のさまざまな技術がさまざまな問題を解決しようとするからです。さまざまなツールは2つのカテゴリに分類されます。
- XMLデータバインディング-XMLドキュメント内の情報をコンピューターメモリ内のオブジェクトとして表すプロセスを指します。通常、これはXSDを定義し、同等のJavaソースコードを生成することを意味します。異なる言語間の相互運用は最優先事項です(そのためXSDを使用します)-最も一般的には、SOAPベースのWebサービスの実装に。
- XMLシリアル化-メモリオブジェクトのグラフをストリームに書き出すことで、どこかで再構成できるようにします。手作業でJavaクラスを記述します。 xml表現は二番目に重要です。また、多くの場合、パフォーマンスの必要性は高く、.netなどの他の言語との相互運用の必要性は低くなります。
xmlシリアル化の場合、Xstreamに勝るものはありません。 JAXBはXMLバインディングの標準です。
どちらの場合でも、J2EEを使用している場合は、クラスプロキシと永続性固有のコレクションタイプがバインディング/シリアル化ツールを混乱させる可能性があるため、JPAから取得したクラスに注意を払う必要があります。
XMLのXSDがあり、既存のクラスセットにデータをバインドする必要がない場合、 XMLBeans 。基本的には、次のように機能します:
- XSDのコンパイル
- 生成されたJavaクラスを使用して、このスキーマに準拠したドキュメントを読み書きします
XMLドキュメントを生成されたクラスにバインドするのは次のように簡単です:
EmployeesDocument empDoc = EmployeesDocument.Factory.parse(xmlFile);
Jibx は、ここで使用されているものです。これは非常に高速ですが、バインディングには少し注意が必要です。ただし、ドメインオブジェクトを記述するXMLスキーマがある場合、XSDに実際にうまくマッピングされるので特に役立ちます(XSDを取得し、スタブドメインクラスとマッピングを作成できるベータツールXSD2Jibxもあります。既存のドメインモデルに適合します)。
バイトコードを操作するため、Java .classファイルの最初のコンパイル後に実行する必要があります。 Mavenプラグインを使用することも、直接使用することもできます(Eclipseプラグインは私には機能しなかったようです)。
私はさまざまな成功を収めたJaxbを使用しました。当時(数年前)全体的なドキュメントは光沢がなく、基本的な使用方法のドキュメント(実装をダウンロードする場所を含む)を見つけることや変更することは困難でした。
Javaクラスを記述したパーサーは、元のXSDとほとんど矛盾せずに非常に優れていました(ただし、抽象的なXML要素のサポートに問題があると思います)。
それ以降は使用していませんが、このようなフレームワークを必要とする今後のプロジェクトがあり、他の誰かが上記をどのようにフェアにするかを知りたいと思います。
私は7年前にキャスターを使用しました-かなりうまくいきました。使用されたDTD。当時は多くの選択肢はありません。
現在のプロジェクトでは、使用しました
1)JAXB-標準ベース、参照実装が利用可能、コマンドラインおよびAntツールが利用可能。最新バージョン-2.1.8にはJava 5以降が必要です。
2)XStream-Soapアンマーシャリング用-Java 5以降が必要です。最新のJAXBほど高速で標準に準拠していません。
BR、
〜A
関連: JavaでのXMLシリアル化
XmlBeans は、特に「壊れた」XSD/WSDL ファイルがある場合に適しています。
ドンが言及した
EmployeesDocument empDoc = EmployeesDocument.Factory.parse(xmlFile);
..しかし、ノード、ファイル、またはほぼあらゆるソースを取ることもできます。
名前空間と戦うことはありません。あなたが除外したいオブジェクトに移動し、factory.parseそれを実行します。
2週間前に見つけていればよかった。
Castorを使用します。それは私たちのニーズにかなりよく合っています。
まったく同じ質問に疑問を抱いていたのですが、ようやくIBMが行ったこのパフォーマンステストを見つけました。 http://www.ibm.com/developerworks/library/x-databdopt2/ 。 JiBXは私の選択だと思います。