1

2 つの XML ファイルfile1.xmlfile2.xml. file1.xsdまた、これらの各ファイルのスキーマも用意していますfile2.xsd

私は(モデル(1)と呼ばれる)にxjc基づいてJavaクラスを作成し、 (モデル(2)と呼ばれる)に基づいてクラスを作成するために使用します。file1.xsdfile2.xsd

model(1) を使用して、ライブラリで file1.xml を非整列化しJAXBます。このデータをモデル(1)からモデル(2)に変換し、変換されたデータをマーシャリングしてfile2.xml

model(1) から model(2) にデータを変換することは可能ですか? マージできますObjectFactoriesか? どうすればいいですか?

4

2 に答える 2

5

ユースケースを考えると、あるXMLスキーマから生成されたJAXB(JSR-222)モデルから別のXMLスキーマから生成された別のJAXBモデルに自動的に変換する方法はありません。いくつかのオプションがあります:

オプション#1-オブジェクトからオブジェクトへの変換

プログラムでオブジェクトモデル間でデータを移動できます。このプロセスを簡単にするマッピングライブラリもあります(http://dozer.sourceforge.net/)。

オプション#2-XSLT

XSLTは、一連のルールに基づいて1つのXMLドキュメントを別のXMLドキュメントに変換するための標準です。を使用するJAXBSourceJAXBResult、JavaモデルでXSLTを使用することもできます。

TransformerFactory tf = TransformerFactory.newInstance();
StreamSource xslt = new StreamSource(new FileInputStream("my-xslt.xml"));
Transformer t = tf.newTransformer(xslt);

JAXBContext jc = JAXBContext.newInstance(MyClass.class);
JAXBSource source = new JAXBSource(jaxbContext1, foo);
JAXBResult result = new JAXBResult(jaxbContext2);
t.transform(source, result);
Bar bar = (Bar) result.getResult();

オプション#3-EclipseLink JAXB(MOXy)の外部マッピングファイル

私はMOXyのリーダーであり、オブジェクトモデルを複数のXML表現にマッピングできる外部マッピングファイルを提供しています。例については、以下のリンクを参照してください。

于 2012-11-08T14:10:42.953 に答える
2

質問を理解しているかどうかはよくわかりません-必要なのは、 Model1 クラスをパラメーターとして受け入れる Model2 クラスにコンストラクターを追加することだと思います。

例として、これが Model1 クラスであるとしましょう:

class Model1{
    String firstname;
    String surname;

}

class Model2{
    String fullName
    public Model2(Model1 m){
        this.fullname=m.firstname+" "+m.surname;
    }
}

つまり、そのコンストラクター内で、属性の値を m から Model2 インスタンスにコピーします。

その後、Model1 と Model2 の間で変換できます。

Model1 m1=unmarshall("file1.xml");
Model2 m2=new Model2(m1);
m2.marshall("file2.xml");

xml 形式間の変換のみを目的とする場合は、代わりにXSLTを使用することをお勧めします。

于 2012-11-08T13:27:49.513 に答える