35.6. 使用模型组
概述
XML Schema 模型组是方便的快捷方式,您可以引用用户定义的复杂类型中的元素组。例如,您可以定义一组在应用程序中常见的元素,然后重复引用该组。模型组使用 group
元素定义,与复杂的类型定义类似。模型组到 Java 的映射也与复杂类型的映射类似。
在 XML Schema 中定义模型组
您可以使用 name
属性的 group
元素在 XML Schema 中定义模型组。name
属性的值是一个字符串,用于在 schema 中引用组。group
元素与 complexType
元素类似,可以将 sequence
元素、all
元素或 choice
元素作为即时子项。
在子元素内,您可以使用 元素元素
定义组的成员。对于组的每个成员,指定一个 元素
。组成员可以使用 element 元素
的任何标准属性,包括 minOccurs
和 maxOccurs
。因此,如果您的组有三个元素,其中之一可能会出现三次,您定义一个具有三个 元素
的组,其中之一使用 maxOccurs="3"。例 35.22 “XML Schema 模型组” 显示具有三个元素的模型组。
例 35.22. XML Schema 模型组
<group name="passenger"> <sequence> <element name="name" type="xsd:string" /> <element name="clubNum" type="xsd:long" /> <element name="seatPref" type="xsd:string" maxOccurs="3" /> </sequence> </group>
在类型定义中使用模型组
旦定义了模型组,就可以将其用作复杂类型定义的一部分。要在复杂类型定义中使用模型组,可将 group
元素与 ref
属性搭配使用。ref
属性的值是提供给组在定义时的名称。例如,使用 例 35.22 “XML Schema 模型组” 中定义的组,如 {ref="tns:passenger" > 所示。例 35.23 “带有模型组的复杂类型”
例 35.23. 带有模型组的复杂类型
<complexType name="reservation">
<sequence>
<group ref="tns:passenger" />
<element name="origin" type="xsd:string" />
<element name="destination" type="xsd:string" />
<element name="fltNum" type="xsd:long" />
</sequence>
</complexType>
当模型组在类型定义中使用时,该组成为类型的成员。因此,保留
实例有四个成员元素。第一个元素是 乘客
元素,它包含由 例 35.22 “XML Schema 模型组” 中显示的组定义的成员元素。例 35.24 “带有 Model Group 的 Type 实例” 中显示了一个 保留
实例示例。
例 35.24. 带有 Model Group 的 Type 实例
<reservation>
<passenger> <name>A. Smart</name> <clubNum>99</clubNum> <seatPref>isle1</seatPref> </passenger>
<origin>LAX</origin>
<destination>FRA</destination>
<fltNum>34567</fltNum>
</reservation>
映射到 Java
默认情况下,当模型组包含在复杂类型定义中时,模型组只映射到 Java 工件。在为包含模型组的复杂类型生成代码时,Apache CXF 只需要将模型组的成员变量包含在为类型生成的 Java 类中。代表模型组的成员变量会根据模型组的定义进行标注。
例 35.25 “使用组的类型” 显示为 例 35.23 “带有模型组的复杂类型” 中定义的复杂类型生成的 Java 类。
例 35.25. 使用组的类型
@XmlType(name = "reservation", propOrder = { "name", "clubNum", "seatPref", "origin", "destination", "fltNum" }) public class Reservation { @XmlElement(required = true) protected String name; protected long clubNum; @XmlElement(required = true) protected List<String> seatPref; @XmlElement(required = true) protected String origin; @XmlElement(required = true) protected String destination; protected long fltNum; public String getName() { return name; } public void setName(String value) { this.name = value; } public long getClubNum() { return clubNum; } public void setClubNum(long value) { this.clubNum = value; } public List<String> getSeatPref() { if (seatPref == null) { seatPref = new ArrayList<String>(); } return this.seatPref; } public String getOrigin() { return origin; } public void setOrigin(String value) { this.origin = value; } public String getDestination() { return destination; } public void setDestination(String value) { this.destination = value; } public long getFltNum() { return fltNum; } public void setFltNum(long value) { this.fltNum = value; }
多个发生次数
您可以通过将 group 元素的 maxOccurs
属性设为大于一的值来指定模型 组
显示为一次。要允许多个出现模型组 Apache CXF 将模型组映射到 List<T>
对象。List<T
> 对象按照组第一个子的规则生成:
-
如果组是使用
序列
元素定义的,请参阅 第 35.5.5 节 “根据序列的出现限制”。 -
如果组是使用
选择
元素定义的,请参阅 第 35.5.3 节 “Choice 元素的出现限制”。