11

これは、JAXBバインディングファイルを本当に理解している人にとっては簡単だと思います...

基本的な質問

複数の要素を同じクラスに非整列化するように JAXB をどのように構成しますか?

注: プロジェクトに別の依存関係 (MOXy など) を追加することは避けたいと思います。理想的には、これは注釈またはカスタム バインディング ファイルを使用して実現できます。

バックグラウンド

同じ要素のさまざまなバリエーション (それぞれがまったく同じプロパティを持つ) を含む XML ドキュメントがあります。以下の例を使用すると、気になるのは「従業員」だけですが、XML では「取締役、マネージャー、およびスタッフ」が指定されています。私たちの目的では、これらはすべて同じ親のサブクラスであり、親タイプ (Employee) のみを操作する必要があり、オブジェクト モデルにはサブクラスのインスタンスがなく、必要ありません。

director, manager, or staff要素の任意のインスタンスをオブジェクトにバインドするように JAXB が必要ですEmployee

入力:

<organization>
    <director>
        <fname>Dan</fname>
        <lname>Schman</lname>
    </director>    
    <manager>
        <fname>Joe</fname>
        <lname>Schmo</lname>
    </manager>    
    <staff>
        <fname>Ron</fname>
        <lname>Schwan</lname>
    </staff>    
    <staff>
        <fname>Jim</fname>
        <lname>Schwim</lname>
    </staff>    
    <staff>
        <fname>Jon</fname>
        <lname>Schwon</lname>
    </staff>    
</organization>

出力:

この例をアンマーシャリングすると、Organization1 つのプロパティを持つオブジェクトになります。List<Employees> employees各従業員には firstName と lastName しかありません。

(注意: 各従業員はEmployeeNOT型Director/Manager/Staffになります。非マーシャリング時にサブクラス情報が失われます。また、マーシャリングのバックアウトについても気にしません。XML からオブジェクトを作成するだけで済みます。)

これは、MOXy のような拡張機能なしで実行できますか? カスタム bindings.xjb ファイルで問題を解決できますか?

4

1 に答える 1

16

これは選択構造に対応します。@XmlElementsこのユースケースには注釈を使用できます。

@XmlElements({
    @XmlElement(name="director", type=Employee.class),
    @XmlElement(name="manager", type=Employee.class)
})
List<Employee> getEmployees() {
    return employees;
}

XML スキーマから開始する場合は、次の方法が役立ちます。

于 2012-06-20T21:21:30.200 に答える