2016-04-29 3 views
0

現在、クラス内にはさまざまなxml要素ラッパーがあります。JAXB:xml要素の名前を透明にします。

xml要素のxmlタグに単一の属性を追加したいとします。 これは私のアプリケーションのフラグとして機能します。

すべてのxml要素は異なる属性値を持つので、私はそれらを一緒にパックすると考えました。

このため、私は2つのフィールドを持つ新しいオブジェクトを作成しました。それを属性として使用するための一般的な値フィールドと文字列フィールド。

残念ながら、値のフィールドから「garbage」xmlタグの前に値を抽出する方法が見つかりません。

これを実行する方法はありますか。 もっと明確にするために、コードの特定の部分を示します。

@XmlRootElement(name = "client") 
class Client { 
    private List<String> names; 

    private List<Integer> salaries; 

    private List<Long> socialSecurityNos; 

    @XmlElementWrapper(name = "names") 
    @XmlElement(name = "name") 
    public List<String> getNames() { 
     return this.names; 
    } 

    @XmlElementWrapper(name = "salaries") 
    @XmlElement(name = "salary") 
    public List<String> getSalaries() { 
     return this.salaries; 
    } 

    @XmlElementWrapper(name = "socialsecuritynos") 
    @XmlElement(name = "socialsecurityno") 
    public List<String> getSocialSecurityNo() { 
     return this.socialSecurityNos; 
    } 
    ... 
    ... 
} 

これは、次のXML

<foo> 
    <names> 
     <name> 
      George 
     </name> 
     <name> 
      John 
     </name> 
    </names> 
    <salaries> 
     <salaries> 
     ... 
     ... 
     </salaries> 
    </salaries> 
    <socialSecurityNo> 
     <socialSecurityNo> 
     ... 
     ... 
     </socialSecurityNo> 
    </socialSecurityNo> 
</foo> 

に新しい価値、私が書いた属性ペアクラスを生成します。

@XmlRootElement(name = "client") 
class GenericElement <T> { 
    private String attribute; 

    private T value; 

    public T getValue() { 
     return this.value; 
    } 

    @XmlAttribute(name = "flag") 
    public String getAttribute() { 
     return this.attribute; 
    } 

} 

そしてもちろん、私はこの結果を取得したいリストの種類

@XmlRootElement(name = "client") 
class Client { 
    private List<GenericElement<String>> names; 

    private List<GenericElement<Integer>> salaries; 

    private List<GenericElement<Long>> socialSecurityNos; 

    ... 
    ... 

を変更しました。

代わりに、「ガーベッジ」値タグを使用します。

<foo> 
    <names> 
     <name flag="on"> 
      <value>George</value> 
     </name> 
     ... 
     <name flag="off"> 
      <value>Value</value> 
     </name> 
    </names> 

    .... 
    ....  
    ....................</value> 
     </socialSecurityNo> 
    </socialSecurityNo> 
</foo> 

答えて

0

@XmlValuevalueフィールドのゲッターに注釈を付けることにより、付加価値のタグを取り除くことが可能であるべきです。 MOXyのリード開発者であるBlaise Doughanによる、blog postがあります。

だから、これを試してみてください:

@XmlRootElement(name = "client") 
class GenericElement <T> { 
    ... 
    @XmlValue 
    public T getValue() { 
     return this.value; 
    } 
    ... 
} 
+0

はどうやらXmlValueは、マーシャリング時にのみ「既知」そうでない場合NullPointerExceptionがスローされた型に対応しています。 – Chrys

+0

ああ、私は、ジェネリック型では動作しません。その場合、[this](http://stackoverflow.com/questions/8807296/jaxb-generic-xmlvalue/8901997#8901997)他の回答は、このトリックを行う必要があります。 –

関連する問題