3

Javaで進化するXMLスキーマを処理するには? Java アプリケーションで古い XML スキーマと進化中の XML スキーマのセットをサポートする必要があるユース ケースがあります (つまり、Foo v1、v2、v3、v4、v5 をサポートします)。

私の使用例には、異なるバージョンの Foo XML スキーマに対して記述されたすべての Foo XML コンテンツを読み取ること、異なるバージョンの OVAL XML スキーマを使用して異なる方法で記述できる Foo XML コンテンツをマージすること (つまり、Foo v1 と Foo v5 をマージすること) が含まれます。

Foo XML スキーマはかなり複雑で、既知の後方互換性の問題があるため、Foo v1 XML コンテンツが Foo v3 XML スキーマを使用した XML スキーマ検証に失敗する可能性があります。

私は 2 つのアプローチを考えました。1) JAXB などの Java XML データバインディングを使用し、XML スキーマの各バージョンのバインディングのセットを生成します。例として Foo XML スキーマを使用して、Foo XML スキーマ v1 から v5 の 5 セットのバインディングを生成します。課題は、あるバージョンの Foo XML コンテンツを別のバージョンの XML コンテンツとマージする方法です。

2) Java データ モデルのセットを 1 つ作成し、SAX、DOM、JDOM を使用して手動で解析し、下位互換性の問題をすべて解決しようとします。課題は、JAXB の助けを借りずに自分で XML を解析しなければならないことです。

進化する XML スキーマを処理するための最善の方法について、アドバイスをいただきたいと思います。Java XML データ バインディングは正しい道なのか、それとも独自の Java データ モデルを作成して手動で解析するのか?

4

3 に答える 3

3

私の経験では、最も重要なのはデータ モデルであり、入力形式ではありません。クリーンなモデルを提供し、さまざまな入力の煩わしさをすべて抽象化することができれば、最終的にはよりクリーンで管理しやすいコードラインになります。

1 つのドキュメントのバージョンはインクリメンタルになる傾向があることを考えると、パーサーを自分で作成すれば、かなりの量のコードを再利用できる可能性があります。または、別のクラスとペアになった各形式を処理するための並列 JAXB パッケージを作成して、そのバージョン固有の変換を行うこともできます。モデルを最上位モデルに変換します。

于 2013-01-10T22:48:31.013 に答える
1

スキーマの進化は、データ バインディング アプローチの大きな欠点です。スキーマが安定していない場合、データ バインディングが面倒になることがわかりました。ここには基本的な矛盾があります。XML は、処理するデータ構造が柔軟 (「半構造化」) になるように設計されていますが、Java はそうではありません。データ バインディングが適切なアプローチであると確信していますか? XSLT や XQuery など、XML 用に設計されたプログラミング言語を使用する方がよいのではないでしょうか?

于 2013-01-11T09:27:21.427 に答える
1

新しいバージョンごとに Java コンバーターがあります。それぞれの以前のバージョンから変換できます。v1 を XML として取得し、JAXB を使用して Java に変換し、データ モデル v2、v3、v4、v5 に変換します。コンバーターはすべて、リリースされたすべてのアーティファクトの一部であるバージョン管理下にあります。

また、v2-1、v2-2 などのブランチもサポートしています。これには、ブランチ n から次のメジャー n+1 へのコンバーターが必要です (例: v2-2 -> v3)。特定の間隔で、「非常に古い」ブランチのサポートを停止します。

于 2013-01-10T22:49:44.623 に答える