[英]JAXB/xjc: Generate classes from child elements and load them based on class types
[英]JAXB / XJC: Generate classes from elements with same complexType
我想使用XJC從以下XSD生成Java類SignResponse
和AuthResponse
:
<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
類,但不SignResponse
和AuthResponse
。 看來type="tns:OrderResponseType"
不XJC正確使用,因為當OrderResponseType
被內部定義SignResponse
和AuthResponse
,一切正常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"
作為屬性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>
提前致謝。
可能不是最佳解決方案,因為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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.