35.6. 使用模型组
概述
XML 架构模型组比较方便了快捷方式,可让您引用用户定义的复杂类型的元素组。例如,您可以定义一组适用于应用程序中多种类型的元素,然后重复引用组。模型组使用 group
元素来定义,与复杂类型定义类似。模型组到 Java 的映射也与复杂类型的映射类似。
在 XML 架构中定义模型组
您可以使用 group
元素和 name
属性在 XML 架构中定义模型组。name
属性的值是一个字符串,用于在架构中指代组。group
元素(如 complexType
元素)可以具有 sequence
元素、all
元素或选择元素作为其即时子。
在子元素内,您可以使用 元素元素
定义组的成员。对于组的每个成员,指定一个 元素
。组成员可以使用 element 元素
的任何标准属性,包括 minOccurs
和 maxOccurs
。因此,如果您的组有三个元素,并且其中一个元素最多可以发生三次,则定义一个含有三个 元素
的组,其中一个使用 maxOccurs="3"。例 35.22 “XML 架构模型组” 显示了一个含有三个元素的模型组。
例 35.22. XML 架构模型组
<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 架构模型组” 中定义的组,使用 {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>
当在类型定义中使用模型组时,组将成为该类型的成员。因此,保留
的实例有四个成员元素。第一个元素是 passenger
元素,它包含由 例 35.22 “XML 架构模型组” 中显示的组定义的成员元素。例 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 节 “对选择元素的发生限制”。