Почему JAXB различает элементы и типы?

1

Итак, если вы хотите определить класс Java из схемы, вам необходимо создать сложный тип для этого класса Java, а затем вы должны объявить XML-элемент для этого типа.

<xs:complexType name="PersonType">
    <xs:sequence>
        <xs:element name="age" type="xs:int"/>
        <xs:element name="name" type="xs:string"/>
        <xs:element name="occupation" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:element name="Person" type="myxml.PersonType"/>

Мой вопрос: почему JAXB различает complexType и element? Кажется, что создается только шаблонный код, где вы должны номинально объявить тип класса дважды.

Например, это казалось бы проще (конечно, он не будет компилироваться):

<xs:element name="Person">
    <xs:sequence>
        <xs:element name="age" type="xs:int"/>
        <xs:element name="name" type="xs:string"/>
        <xs:element name="occupation" type="xs:string"/>
    </xs:sequence>
</xs:element>

Может ли кто-нибудь указать на обоснование дизайна этого аспекта JAXB?

Теги:
jaxb
xsd

1 ответ

2
Лучший ответ

Сложный тип соответствует объявлению класса. Тег элемента соответствует объявлению поля. Глядя на ваш пример, который может показаться шаблоном, поскольку вы только "объявляете одно поле данного типа", однако в более сложных схемах это пригодится.

Например, если вы хотите представить семью, PersonType будет использоваться для нескольких элементов:

<xs:complexType name="FamilyType">
    <xs:sequence>
        <xs:element name="father" type="PersonType"/>
        <xs:element name="mother" type="PersonType"/>
        <xs:element name="child" type="PersonType" maxOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>

<xs:element name="family" type="FamilyType"/>

Также необходим element, если вы хотите использовать тип в XML файле (как самый верхний тег в пространстве имен).

В вашем случае рассмотрите следующую альтернативу:

<xs:element name="Person">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="age" type="xs:int"/>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="occupation" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Кстати: XML-Schema не была специально разработана для JAXB, JAXB был разработан как инструмент для использования с уже существующим форматом XML-Schema.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню