2017-04-13 91 views
0

我想使用XJC生成Java類從以下XSD SignResponseAuthResponseJAXB/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> 

這意味着從具有相同的complexType元件產生的類。使用上述XSD作爲輸入,XJC將生成OrderResponseType類,但不生成SignResponseAuthResponse。這似乎type="tns:OrderResponseType"不受XJC正確使用,因爲當OrderResponseType是內部SignResponseAuthResponse定義,一切正常OK:

<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",但這個工程只有一個,只有當具有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

可能不是最好的解決方案,因爲SignResponse的和AuthResponse的基類將是JAXBElement<OrderResponseType>,不OrderResponseType。但是,您可以使用以下jaxb綁定有兩個不同的類:

<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

我們最終使用OrderResponseType而不是SignResponse和AuthResponse。 – frevib

相關問題