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 元素的出现限制”。