【问题标题】:JAXB / XJC: Generate classes from elements with same complexTypeJAXB / XJC:从具有相同 complexType 的元素生成类
【发布时间】:2017-04-13 19:02:54
【问题描述】:

我想使用 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",因为当OrderResponseTypeSignResponseAuthResponse 中定义时,一切正常:

<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>

将多个元素与此&lt;xjc:simple/&gt; XJB 绑定元素结合使用将导致仅生成OrderResponseType

使用自定义绑定,例如:

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

也只适用于一个元素。 XJC 使用时会抛出异常 e.g.:

<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>

提前致谢。

【问题讨论】:

    标签: java xsd jaxb xjc


    【解决方案1】:

    可能不是最好的解决方案,因为SignResponseAuthResponse 的基类将是JAXBElement&lt;OrderResponseType&gt;,而不是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>
    

    【讨论】:

    • 我们最终使用了 OrderResponseType 而不是 SignResponse 和 AuthResponse。
    猜你喜欢
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多