2016-10-20 25 views
1

私はXMLメッセージを受け取ったアプリケーションを持っており、それを解析して処理を行います。これをアプリケーションで使用するには、XML文字列を受け取った後、JAXB marshallerをj​​ava POJOにマーシャリングし、処理はここから処理を引き継ぎます。 これは、私がXMLの1つのバージョンを持っている時までうまく動作します。Java:複数のバージョンのXMLスキーマを扱う

問題 ただし、同じXSDの複数のバージョンがある場合に問題が発生します。私のアプリケーションは両方のバージョンのメッセージに対処しなければなりません。私のアプリケーションのクライアントは、古いバージョンのXMLを送信するか、最新のバージョンのXMLを送信することがあります。

JAXBの場合、JAX XJCツールを使用してXSDをJava pojosに変換する必要があります。問題は、以前のバージョンと同じクラス名を持つXSDの最新バージョンを変換するときに発生します。クラスは異なります。これは、バージョンごとに異なるジャーにXJC出力を置いても問題を引き起こします。

期待ソリューション バージョンの変化は、6ヶ月毎に発生することが予想されると私は古いバージョンを伴って含むまた、新しいバージョンのXMLSを読み、私のシステムができるようにする必要があります。 JAXBやその他のフレームワークを使用して、このXML処理をJAVAで管理する方法を知りたいです。

私はSAXパーサーを使用しますか?私はそれがJAXBに比べて効率的ではないことを読んだ。そして、ここ数日間SAXパーサを使って作業をした結果、各要素を探し出して値を取得し、それを私たちのJava構造に組み込むことでエラーが発生する可能性があることがわかりました。 JAXBと比較して

* 質問

は、JAXBのような類似したいずれかの簡単な解決策はありますか?私は良い解決策のように満足していないこれで一時的な解決策を、使用している

*

一時的な解決策が使用されます。私がやったことは、XJCツールを使って各XSDバージョンごとに別々の瓶を作りました。そして、各容器に異なるパッケージを作りました。バージョン1.2の 1のPOJOは、バージョン2.0のベースパッケージcom.cgs.v_12 2のPOJOとジャーにあるiは両方達人として加えたベースパッケージcom.cgs.v_20

と異なるジャーています私のシステムに依存して、異なるバージョンを処理するためにそれらを使用します。

+0

入力xmlのバージョンをどのように知っていますか?バージョンを取得するためにファイルを解析する必要がありますか、または2つの異なるチャネルから受信した入力ファイルですか? – Mahesh

+0

任意のバージョン形式のxmlを(例えばxsltなどで)変更しない内部形式に変換して、この内部形式で処理することができます。 –

答えて

0

JAXB/XSD - > POJO間をマッピングする他のソリューションの場合、特にPOJOが生成される場合、これは1-1マッピングになります。

(1)XML全体をPOJOにマップするか、 (2)そのXMLのサブセットを静的/固定POJOモデルにマップしますか?

後続のバージョンにおける変化を予想することができないので、(1)、私は信じている場合のためのソリューション上記バージョンに基づいて、正しいJAXBアーティファクトを選択するために、戦略パターンを使用するであろう

場合(2 )、バージョンごとのXPATHマッピングを定義してXPATHを使用して探索できます。

関連する問題