2017-04-13 15 views
0

私はXJCを使用して、次のXSDからJavaクラスSignResponseAuthResponseを生成したいと思います:JAXB/XJC:同じのcomplexTypeに要素からクラスを生成

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <xsd:element name="SignResponse" type="tns:OrderResponseType"/> 
    <xsd:element name="AuthResponse" type="tns:OrderResponseType"/> 

    <xsd:complexType name="OrderResponseType"> 
     <xsd:sequence> 
      <xsd:element name="orderRef" type="xsd:string"/> 
      <xsd:element name="autoStartToken" type="xsd:string"/> 
     </xsd:sequence> 
    </xsd:complexType> 

</xsd:schema> 

これは、同じ複合型を持つ要素からクラスを生成することを意味します。上記のXSDを入力として使用すると、XJCはOrderResponseTypeクラスを生成しますが、SignResponseおよびAuthResponseは生成しません。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <xsd:element name="SignResponse"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="orderRef" type="xsd:string"/> 
       <xsd:element name="autoStartToken" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
    <xsd:element name="AuthResponse"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="orderRef" type="xsd:string"/> 
       <xsd:element name="autoStartToken" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 

次XJBを使用して、type="tns:OrderResponseType"が実際に使用されますが、一つだけがある場合にのみ、これは動作します:OrderResponseTypeSignResponseAuthResponse内で定義されたとき、すべてがOK動作するためtype="tns:OrderResponseType"は、XJCによって適切に使用されていないようです属性としてtype="tns:OrderResponseType"を持つ要素:

<jxb:bindings version="1.0" 
      xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
      xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"> 

    <jxb:globalBindings> 
     <xjc:simple/> 
    </jxb:globalBindings> 

</jxb:bindings> 

この<xjc:simple/> XJB結合要素と組み合わせて複数の要素を使用するだけでOrderResponseTypeが生成されます。以下のようなカスタムバインディングを使用して

<jxb:bindings node="//xs:complexType[@name='OrderResponseType']"> 
    <jxb:class name="SignResponse"/> 
</jxb:bindings> 

も一つだけの要素のために働きます。 XJCは、例:

<jxb:bindings node="//xs:complexType[@name='OrderResponseType']"> 
    <jxb:class name="SignResponse"/> 
</jxb:bindings> 
<jxb:bindings node="//xs:complexType[@name='OrderResponseType']"> 
    <jxb:class name="AuthResponse"/> 
</jxb:bindings> 

ありがとうございます。

答えて

0

SignResponseAuthResponseの基本クラスがOrderResponseTypeではなくJAXBElement<OrderResponseType>になるため、おそらく最適な解決策ではありません。しかし、次のjaxbバインディングを使用して2つの異なるクラスを作成することができます。

<jxb:bindings schemaLocation="schema.xsd" node="/xsd:schema"> 
    <jxb:bindings node="//xsd:element[@name='SignResponse']"> 
     <jxb:class name="SignResponse"/> 
    </jxb:bindings> 
    <jxb:bindings node="//xsd:element[@name='AuthResponse']">    
     <jxb:class name="AuthResponse"/> 
    </jxb:bindings> 
</jxb:bindings> 
+0

SignResponseおよびAuthResponseの代わりにOrderResponseTypeを使用しました。 – frevib

関連する問題