2014-09-06 26 views
1

我有它的最頂端的元素是DocumentJAXB如何編組可以匹配兩種類型的XML時決定創建哪種類型?

<xsd:element name="Document" type="Document"/> 

它包含類型ZZ_Customer的一個元素,它的客戶的限制的XML模式。 這兩個元素都包含同名兒童,但類型略有不同。

<xsd:complexType name="Document"> 
     <xsd:sequence> 
      <xsd:element name="CstmrCdtTrfInitn" type="ZZ_Customer"/> 
     </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="ZZ_Customer"> 
    <xsd:complexContent> 
     <xsd:restriction base="Customer"> 
       <xsd:sequence> 
        <xsd:element name="GrpHdr" type="ZZ_Group"/> 
        <xsd:element name="PmtInf" type="ZZ_Payment" maxOccurs="unbounded"/>       
       </xsd:sequence> 
      </xsd:restriction> 
     </xsd:complexContent> 
</xsd:complexType> 

<xsd:complexType name="Customer"> 
     <xsd:sequence> 
      <xsd:element name="GrpHdr" type="Group"/> 
      <xsd:element name="PmtInf" type="Payment" maxOccurs="unbounded"/> 
     </xsd:sequence> 
</xsd:complexType> 

當JAXB的解組XML文件,將它創建ZZ_Customer的實例或將其創建客戶的一個實例?同樣,什麼時候它會創建一個Group或ZZ_Group的實例?

我注意到JAXB會將ZZ_ *的實例用於XML的某些部分,但將其基本計數器部分用於XML的其他部分。

它在什麼基礎上做出決定? JAXB正在使用的標準並不明顯。

不幸的是,我無法控制架構及其設計。

+0

您顯示的XML模式不完整。您必須提供帶和不帶ZZ_的Group和Payment的定義,以便可以編譯XML Schema並調查結果。 ---所有未定義的類型都像csd:string這樣的類型的簡單替換會導致xjc拒絕編譯,這是可以理解的。 – laune 2014-09-07 18:40:08

回答

0

由於Document具有與子類型對應的屬性。 解組時將創建子類型。這是有道理的,因爲在Java中,當一個屬性被鍵入到子類中時,您無法在其上設置超類的實例。

如果屬性與超類型相對應,默認情況下,JAXB會將其解組爲超類型的實例。該XML可以包含xsi:type屬性以指定正在使用該子類型。