3

私はこれを頭の中で調べて、数日間さまざまなアプローチを試し、SO(XMLをJavaオブジェクトに変換するためのベストプラクティスは何ですか?)とGoogleを検索してXSLT上でJAXBを使用しましたが、できません適切な答えを見つけてください。何年にもわたって、さまざまなプロジェクトでCastor、JIBX、XSLTを使用してきたので、XMLバインディングについて少し知っています。

私の問題は、非常にフラットなXML構造を持っており、それをJavaクラスにアンマーシャリングして、リレーショナルデータベース(Oracleである必要があります)に直接永続化することです。小さな例...

<Output>
    <Channel>
        <channelId>1</channelId>
        <genreId>1</genreId>
    </Channel>
    <Channel>
        <channelId>2</channelId>
        <genreId>2</genreId>
    </Channel>
    <Genre>
        <genreId>1</genreId>
        <name>Movies</name>
    </Genre>
    <Genre>
        <genreId>2</genreId>
        <name>Sport</name>
    </Genre>
    <ChannelName>
        <channelId>1</channelId>
        <name>The Movie Channel</name>
    </ChannelName>
    <ChannelName>
        <channelId>2</channelId>
        <name>The Sport Channel</name>
    </ChannelName>
</Output>

上記のXMLに本当に必要なのは、OneToOne関係にある2つの単純な注釈付きクラスであり、JPAを使用して永続化できます。基本的に、次のようなデータベーステーブルを反映するクラスが必要です。

class Channel {
    Long id;
    String name;
    Genre genre;        
}

class Genre {
    Long id;
    String name;       
}

XMLはマーシャリングされないだけであり、主観的な質問になる可能性があることを認識しているこの問題の最も簡単な解決策を本当に探しています。

私はXSLTのファンなので、XSLTを使用して元のXMLをより適切な構造に曲げ、コードとより厳密に一致させてから、非常に単純なJAXBアノテーションを使用してクラスにバインドするのが良い設計かどうかを本当に尋ねています。XMLAdapterまたは、JAXBを使用して「変換」を行うことを選択する必要があります。これには、 sやアノテーションなどのより実際のJavaコードが含まれると思います。基本的に、JAXBはXSLTに対して何のメリットがありますか、それとも他に何が得られますか?

4

3 に答える 3

15

JAXBは、JavaオブジェクトからXMLへのバインディングAPIです。

XSL-TはXMLをXMLに変換します。

彼らは私にとって同じことのようには感じません。最終結果はXMLになる可能性がありますが、ソースはそれぞれ異なります。

答えは、それぞれのテクノロジーに対するあなたの快適さのレベルに依存すると思います。XSL-TとJAXBの組み合わせが自然に感じられる場合は、繰り返し実行されるランタイム操作でない限り、必ずその方向に進んでください。その場合、変換の複雑さによっては、パフォーマンスが問題になる可能性があります。

于 2011-04-01T19:42:16.160 に答える
2

XStream、特にそのConvertersAPIを確認することをお勧めします。

XStreamは、XSD(JAXBで必要になると思います)を提供する必要なしに、XMLをJavaにシリアル化または逆シリアル化する非常に簡単な方法を提供します。

于 2011-04-01T19:49:04.993 に答える
0

JAX-RSに加えて、JAXBとXSLを統合するWeb開発フレームワークであるReXSLを見てください。このサイトは、すべてのページをJAXB注釈付きオブジェクトとして生成し、フレームワークによってXMLに変換されます。次に、このXMLは、XSLスタイルシートが添付された状態でブラウザーに配信されます。

于 2012-10-30T17:50:58.767 に答える