第 35 章 使用复杂类型
摘要
复杂的类型可以包含多个元素,它们可以具有属性。它们映射到 Java 类中,可保存类型定义所代表的数据。通常,映射是包含一组代表元素的属性和内容模型属性的 bean。
35.1. 基本复杂度类型映射
概述
XML Schema 复杂的类型定义构造包含比简单类型更复杂的信息。最简单的复杂类型使用 属性定义一个空元素。更复杂的类型由一系列元素组成。
默认情况下,XML Schema 复杂类型映射到 Java 类,其成员变量代表 XML Schema 定义中列出的每个元素和属性。类为每个成员变量设置了 setters 和 getters。
在 XML Schema 中定义
XML Schema 复杂类型使用 complexType
元素进行定义。complexType
元素嵌套了用于定义数据结构的其余元素。它可显示为指定类型定义的父元素,或者作为元素的子元素来匿名定义存储在元素中的信息结构。当使用
complexType
元素来定义指定类型时,它需要使用 name
属性。name
属性指定引用该类型的唯一标识符。
包含一个或多个元素的复杂类型定义具有 表 35.1 “在复杂类型中定义如何元素” 中描述的其中一个子元素。这些元素决定了指定的元素在类型的实例中如何。
element | 描述 |
---|---|
| 定义为复杂类型的一部分定义的所有元素都必须显示在类型的实例中。但是,它们可以以任何顺序出现。 |
| 只有一个元素定义为复杂类型的一部分,才能出现在类型的实例中。 |
| 定义为复杂类型的一部分定义的所有元素都必须显示在类型的实例中,它们也必须按照类型定义中指定的顺序出现。 |
如果复杂的类型定义只使用属性,则不需要 表 35.1 “在复杂类型中定义如何元素” 中描述的一个元素。
确定元素的出现方式后,您可以通过向定义中添加一个或多个 元素
子项来定义元素。
例 35.1 “XML Schema complex 类型” 在 XML Schema 中显示复杂的类型定义。
例 35.1. XML Schema complex 类型
<complexType name="sequence"> <sequence> <element name="name" type="xsd:string" /> <element name="street" type="xsd:short" /> <element name="city" type="xsd:string" /> <element name="state" type="xsd:string" /> <element name="zipCode" type="xsd:string" /> </sequence> </complexType>
映射到 Java
XML 架构复杂类型映射到 Java 类。复杂类型定义中的每个元素都映射到 Java 类中的成员变量。getter 和 setter 方法也为复杂类型中的每个元素生成。
所有生成的 Java 类都使用 @XmlType
注释进行解码。如果映射用于复杂类型,则注解名称设置为 complexType
元素的
。如果将复杂类型定义为元素定义的一部分,则 name
属性的值@XmlType
注释的 name
属性的值是 element
元素的 name
属性的值。
如 “带有在线类型的元素的 Java 映射”一节 所述,如果为定义为元素定义的复杂类型生成了 @XmlRootElement
注释,生成的类被解码。
为了提供运行时准则,指示应该如何处理 XML Schema 的元素,代码生成器会改变用于分离类及其成员变量的注解。
- 所有复杂度类型
所有复杂的类型都使用
all
元素来定义。它们按如下方式标注:-
@XmlType
注释的propOrder
属性为空。 -
每个元素使用
@XmlElement
注释进行解码。 @XmlElement
注释的必需
属性设置为true
。例 35.2 “All Complex Type 的映射” 显示所有复杂类型的映射,其中有两个元素。
例 35.2. All Complex Type 的映射
@XmlType(name = "all", propOrder = { }) public class All { @XmlElement(required = true) protected BigDecimal amount; @XmlElement(required = true) protected String type; public BigDecimal getAmount() { return amount; } public void setAmount(BigDecimal value) { this.amount = value; } public String getType() { return type; } public void setType(String value) { this.type = value; } }
-
- Choice Complex Type
使用选择元素定义
选择
复杂类型。它们按如下方式标注:-
@XmlType
注释的propOrder
属性按照 XML Schema 定义中显示的顺序列出元素的名称。 没有注解成员变量。
例 35.3 “选择复杂度类型的映射” 显示了选择复杂的类型的映射,其中有两个元素。
例 35.3. 选择复杂度类型的映射
@XmlType(name = "choice", propOrder = { "address", "floater" }) public class Choice { protected Sequence address; protected Float floater; public Sequence getAddress() { return address; } public void setAddress(Sequence value) { this.address = value; } public Float getFloater() { return floater; } public void setFloater(Float value) { this.floater = value; } }
-
- 序列复杂度类型
使用序列元素定义
序列
复杂类型。它标明如下:-
@XmlType
注释的propOrder
属性按照 XML Schema 定义中显示的顺序列出元素的名称。 -
每个元素使用
@XmlElement
注释进行解码。 @XmlElement
注释的必需
属性设置为true
。例 35.4 “序列复杂度类型的映射” 显示 例 35.1 “XML Schema complex 类型” 中定义的复杂类型的映射。
例 35.4. 序列复杂度类型的映射
@XmlType(name = "sequence", propOrder = { "name", "street", "city", "state", "zipCode" }) public class Sequence { @XmlElement(required = true) protected String name; protected short street; @XmlElement(required = true) protected String city; @XmlElement(required = true) protected String state; @XmlElement(required = true) protected String zipCode; public String getName() { return name; } public void setName(String value) { this.name = value; } public short getStreet() { return street; } public void setStreet(short value) { this.street = value; } public String getCity() { return city; } public void setCity(String value) { this.city = value; } public String getState() { return state; } public void setState(String value) { this.state = value; } public String getZipCode() { return zipCode; } public void setZipCode(String value) { this.zipCode = value; } }
-