为什么JAXB区分元素和类型?

时间:2014-07-29 20:55:49

标签: java xml jaxb xsd

因此,如果要从Schema定义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这方面背后的设计理由吗?

1 个答案:

答案 0 :(得分:2)

复杂类型对应类声明元素标记对应于字段声明。看看你的例子可能看起来像样板,因为你只“声明一个给定类型的一个字段”,但是在更复杂的模式中它会派上用场。

E.g。如果您想代表一个家庭,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"/>

如果要在xml文件中使用类型(作为命名空间中最顶层的标记),还需要element

在您的情况下,请考虑以下替代方案:

<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格式一起使用的工具。