因此,如果要从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这方面背后的设计理由吗?
答案 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格式一起使用的工具。