2014-09-06 1 views
1

У меня есть XML-схема которого верхнего элемент документКак JAXB определяет, какой тип следует создавать, когда он упорядочивает XML, который может соответствовать обоим типам?

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

Он содержит один элемент типа ZZ_Customer, который является ограничением Заказчика. Оба эти элемента содержат детей с одноименным названием, но с немного разными типами.

<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 unmarshalls в XML-файл будет его создать экземпляр ZZ_Customer или будет создать экземпляр Клиента? Аналогично, когда он создаст экземпляр группы или ZZ_Group?

Я заметил, что JAXB будет экземплярами ZZ_ * для определенных частей XML, но использует их базовые счетные части для других частей XML.

На каком основании он принимает решения? Не кажется очевидным, какие критерии использует JAXB.

К сожалению, у меня нет контроля над схемой и ее дизайном.

+0

Представленная вами XML-схема неполна. Вам необходимо будет предоставить определения группы и платежа с ZZ_ и без него, чтобы XML-схема могла быть скомпилирована и результаты могут быть исследованы. --- Простые подстановки таких типов, как csd: string для всего, что является неопределенным результатом в xjc, отказывающемся компилировать, что понятно. – laune

ответ

0

С Document имеет свойство, соответствующее подтипу. Подтип будет создан при разборке. Это имеет смысл, поскольку в Java, когда свойство вводится в подкласс, вы не можете установить экземпляр суперкласса на нем.

Если свойство соответствует супертипному типу, по умолчанию JAXB отменил бы его на экземпляр супер-типа. XML может содержать атрибут xsi:type, чтобы указать, что этот подтип используется.

Смежные вопросы