35.5.5. 对序列的限制
概述
默认情况下,序列
元素的内容只能在复杂类型的实例中出现一次。您可以使用 minOccurs
属性及其 maxOccurs
属性来更改由 sequence
元素定义的元素序列的次数。通过使用这些属性,您可以指定序列类型可能会为零到复杂类型的实例中无限次。
使用 XML 架构
minOccurs
属性指定在定义的复杂类型的实例中必须发生序列的最少次数。其值可以是任意正整数。将 minOcc
指定序列不需要出现在复杂类型的实例中。
urs
属性设置为 0。
maxOccurs
属性指定在定义的复杂类型的实例中可以发生的次数的上限。其值可以是任意非零、正整数或未绑定的 。将
maxOccurs
属性设置为
unbounded,表示序列会出现无限次数。
例 35.20 “带有 Occurrence Constraints 的序列” 显示序列类型 CultureInfo
的定义,其顺序存在限制。序列可重复 0 到 2 次。
例 35.20. 带有 Occurrence Constraints 的序列
<complexType name="CultureInfo"> <sequence minOccurs="0" maxOccurs="2"> <element name="Name" type="string"/> <element name="Lcid" type="int"/> </sequence> </complexType>
映射到 Java
与单个实例序列不同,XML Schema 序列可能会多次映射到具有单个成员变量的 Java 类。这个单一成员变量是一个 List<T
> 对象,其中包含序列多次出现的所有数据。例如:如果 例 35.20 “带有 Occurrence Constraints 的序列” 中定义的序列出现两次,则列表将是四项。
Java 类的成员变量的名称通过串联成员元素的名称来派生。元素名称由 And
分隔,变量名称的第一个字母会被转换为小写。例如,从 例 35.20 “带有 Occurrence Constraints 的序列” 生成的成员变量名为 nameAndLcid
。
列表中存储的对象类型取决于成员元素的类型。例如:
-
如果生成的列表位于同一类型的成员元素,则生成的列表将包含
JAXBElement<T>
对象。JAXBElement<T>
; 对象的基本类型由 member 元素类型的典型映射决定。 - 如果成员元素是不同的类型,并且它们的 Java 表示实施了通用接口,则列表将包含通用接口的对象。
- 如果成员元素是不同的类型,并且它们的 Java 表示扩展了一个通用基础类,则该列表将包含通用基础类的对象。
-
如果没有满足其他条件,则列表将包含对象
对象
。
生成的 Java 类仅具有 member 变量的 getter 方法。getter 方法返回对实时列表的引用。对返回的列表进行的任何修改都会影响实际对象。
Java 类与 @XmlType
注释进行解码。注解的 name
属性设置为 XML 架构定义的父元素中的 name
属性的值。该注解的 propOrder
属性包含代表序列中的元素的单个成员变量。
代表序列的 member 变量使用 @XmlElements
注释来解码序列中的元素。@XmlElements
注释包含以逗号分隔的 @XmlElement
注释列表。该列表具有一个 @XmlElement
注释,用于类型 XML 架构定义中定义的每个成员元素。列表中 @XmlElement
注释的 name
属性设为 XML Schema 元素
的 name
属性的值,它们 类型
属性设置为 Java 类,从 XML Schema 元素
元素类型映射而生成的 Java 类。
例 35.21 “带有 Occurrence 约束的序列代表” 显示 例 35.20 “带有 Occurrence Constraints 的序列” 中定义的 XML 架构序列的 Java 映射。
例 35.21. 带有 Occurrence 约束的序列代表
@XmlType(name = "CultureInfo", propOrder = { "nameAndLcid" }) public class CultureInfo { @XmlElements({ @XmlElement(name = "Name", type = String.class), @XmlElement(name = "Lcid", type = Integer.class) }) protected List<Serializable> nameAndLcid; public List<Serializable> getNameAndLcid() { if (nameAndLcid == null) { nameAndLcid = new ArrayList<Serializable>(); } return this.nameAndLcid; } }
minOccurs 设置为 0
如果仅指定了 minOccurs
元素,其值为 0,
则代码生成器会生成 Java 类,就像未设置 minOccurs
属性一样。