2012-02-10 9 views
1

私はIHE ITI HL7プロファイルをいくつか実装しており、JaxBクラスを生成したスキーマが利用可能です。最近私は、スキーマの異なるバージョン間にいくつかの違いがあることを発見しました。特に、XML要素の中にはXML属性があるものがあります。値をxml属性または要素として扱うことは可能ですか?

以前はタイプコードの属性はXML要素にマッピングされた、以下の例を参照してください。今すぐタイプコード属性をXML属性にマップされ

<acknowledgement> 
    <typeCode code="AE"/> 
</acknowledgement> 

を、以下の例を参照してください。

<acknowledgement typeCode="AE"/> 

がありますこれらのフォームのいずれかに入っている型コードを持つメッセージを扱うことができる注釈やその他の可能性を使用してクラスを作成することはできますか?さらに良いことに、XJCジェネレータに私のために自動的に、おそらく何らかのバインディングをさせる方法がありますか?

現在のところ、@ XmlAttributeアノテーションを持つフィールドです。

+0

両方をマッピングし、nullでないものを取得するヘルパーメソッドを持たない理由はありますか? –

+0

私はそれをしなければならないかもしれないと思います。私は実際にコード生成を介して一般的に適用できる解決策を見つけたいと思います。なぜなら、約1500のクラスがあるからです。さて、おそらく私が知っているユースケースにまで減らすことはできますが、それはちょっと難しいことです。 – AHungerArtist

+1

特定のXSDバージョンごとに異なるJAXBクラスを生成したいと思います。これはいくつかの冗長性を導入していますが、あなたは安全な側です... – home

答えて

2

あなたの手が少し汚れている場合は、XJCプラグインを使用してこれをきちんと行うことができます。 XJCには、Sun Codemodel APIを使ってモデルクラスにアクセスするためのプラグイン機能があります。基本的なことを理解したら、JAXBモデルの生成中にあらゆる種類の有用なことを行うのはそれほど難しいことではありません。良いチュートリアルhereがあります。私は実際にテストしていない

public class MyModel 
{ 
    // this part is automatically generated by xjc 
    @XmlAttribute 
    public String foo; 

    // you add this with your custom xjc plugin 
    @XmlElement(name="foo") 
    public String getFooElement() { return foo; } 
    public void setFooElement(String newFoo) { foo = newFoo; } 
} 

:あなたは今の属性要素がされている告げるいくつかの設定を持っていると仮定すると今

、私はそれのようなものを見えるようにあなたは、モデルクラスを変更することができ考えるこの理論を説明しますが、モデルクラスを手動で変更して、一般的な考え方が機能するかどうかを確認するのは簡単です。

+0

世代が進むにつれて有望です。あなたの例が示すように、これはこの状況を処理する有効な方法です。非常に最悪の場合、XJCの生成を正しく行えない場合は、コードまたはスキーマを編集できます。ありがとう。 – AHungerArtist

関連する問題