JAXB / XJC:从具有相同complexType的元素生成类

时间:2017-04-13 19:02:54

标签: java xsd jaxb xjc

我想使用XJC从以下XSD生成Java类SignResponseAuthResponse

<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。 XJC似乎未正确使用type="tns:OrderResponseType",因为在OrderResponseTypeSignResponse内定义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",但仅当只有一个元素具有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>

提前致谢。

1 个答案:

答案 0 :(得分:0)

可能不是最佳解决方案,因为SignResponse&{39}和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>