2011-12-15 52 views
3

JAXBを使用してXMLからJavaオブジェクトへのバインディングを定義しようとしています。すべては私がにしようとしているとき以外は正常に動作します XMLのようなこの生産:私は次の例外を取得していますJAXB "あるクラスに@XmlElementプロパティがある場合、@ XmlValueプロパティを持つことはできません。"

@XmlRootElement(name="request") 
public class Request { 

    @XmlValue 
    public String getCommandID() { return "Get Price"; }; 

    @XmlElement 
    public String getSessionID() { return "read-only"; }; 

} 

:クラスはこののように定義されたオブジェクトから

<request> 
    Get Price 
    <sessionId>read-only</sessionId> 
</request> 

を:

If a class has @XmlElement property, it cannot have @XmlValue property. 

"sessionId"要素を属性に変更すると、すべて正常に動作しますが、もちろんそれを要素にしたいと思います。

私はJAXBが非常に柔軟性があると思っていましたが、私は何かが明らかでないと確信しています。

お手伝いできますか?

答えて

5

あなたがマップするために探しているXMLドキュメントの種類は、「混合コンテンツ」を有すると呼ばれています。対応するXMLスキーマは、次のようになります。

<xs:element name="request"> 
    <xs:complexType mixed="true"> 
     <xs:sequence> 
      <xs:element name="sessionId" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

これは、テキストノードが要素ノードと混在して表示される可能性があることを意味します。サンプル文書を変換するための規則は簡単ではありませんが、以下の文書も有効で、規則はあまり明確ではありません。

<request> 
    Get Price 
    <sessionId>read-only</sessionId> 
    More Text 
</request> 

混合テキストには用途がありますが、一般的には眉をひそめます。好ましいアプローチは、あなたの質問に記載されたXML属性を使用することです:

<request sessionId="read-only">Get Price</request> 

JAXBは@XmlMixed注釈参照混在テキストを扱うことができる方法を確認するには:

+1

ありがとうございました! ここで、意味のあるエラーメッセージを生成するのに一般的なJAXBが、そのメッセージに '@XmlMixed'アノテーションを記述することを希望します。 :)別の手で、私は最初にマニュアルを読む必要があります;-) – AlexV

+0

Blaise、質問で説明されている出力を達成するために@XmlMixed注釈を使用して詳しく説明できますか?私はまったく同じ要件を持っています。私は出力が何であるかを制御できません。ただ一致させるだけです。サードパーティのプログラムはXMLを入力として受け入れ、フォーマットは混在しているので、私の手は結びついています... –

1

commandIdの要素にも問題はありますか?例えば

<request> 
    <commandId>Get Price</commandId> 
    <sessionId>read-only</sessionId> 
</request> 

@XmlRootElement(name="request") 
public class Request { 

    @XmlElement 
    public String getCommandID() { return "Get Price"; }; 
    // btw, why's this a constant? 

    @XmlElement 
    public String getSessionID() { return "read-only"; }; 
    // and this too? 

} 
+0

を_// btw、これはなぜ定数ですか?_>私は混同するつもりはありませんでした。単なる説明のためです。ありがとう! – AlexV

関連する問題