35.5. 发生限制
35.5.1. 支持 Occurrence 限制的 schema 元素
通过 XML Schema,您可以在组成复杂类型定义的四个 XML Schema 元素上指定出现的限制:
35.5.2. All 元素的出现限制
XML Schema
使用
元素定义的复杂类型不允许对所有元素定义的多个结构进行多次。但是,您可以通过将 all
minOccurs
属性设置为
0
来使所有元素可选定义的结构。
映射到 Java
将 all
元素的 minOccurs
属性设置为 0
对生成的 Java 类没有影响。
35.5.3. Choice 元素的出现限制
概述
默认情况下,选择
元素的结果只能出现在复杂类型的实例中。您可以使用 minOccurs
属性及其 mxOccurs
属性更改元素所定义的结构的次数。您可以使用这些属性,指定所选类型可能为零到复杂类型的实例中无限次。为选择类型选择的元素对于每种类型来说都不需要相同。
在 XML Schema 中使用
minOccurs
属性指定必须出现所选类型的最小次数。其值可以是任意正整数。将 minOccurs
属性设置为 0
指定,可选择类型不需要在复杂类型的实例中出现。
maxOccurs
属性指定可选择类型可显示的最大次数。其值可以是任意非零、正整数或未绑定的 。将
maxOccurs
属性设置为 unbounded
时,指定所选类型可能会显示无限次。
例 35.18 “Choice Occurrence Constraints” 显示选择类型 ClubEvent
的定义,其中选择出现的限制。整个选择类型可以重复 0 到未绑定时间。
例 35.18. Choice Occurrence Constraints
<complexType name="ClubEvent"> <choice minOccurs="0" maxOccurs="unbounded"> <element name="MemberName" type="xsd:string"/> <element name="GuestName" type="xsd:string"/> </choice> </complexType>
映射到 Java
与单个实例选择结构不同,XML Schema 选择结构可以多次通过单个成员变量映射到 Java 类。这个单一成员变量是一个 List<T
> 对象,它保存多个顺序发生的所有数据。例如,如果 例 35.18 “Choice Occurrence Constraints” 中定义的序列发生两次,则列表将有两个项目。
Java 类的成员变量的名称通过串联 member 元素的名称来派生。元素名称由 Or
分隔,变量名称的第一个字母转换为小写。例如,从 例 35.18 “Choice Occurrence Constraints” 生成的成员变量将命名为 memberNameOrGuestName
。
存储在列表中的对象类型取决于成员元素的类型。例如:
-
如果成员元素是相同类型,生成的列表将包含
JAXBElement<T>
对象。JAXBElement<T>
; 对象的基础类型由 member 元素类型的普通映射决定。 - 如果成员元素是不同类型的,且其 Java 表示实施了通用接口,则列表将包含常见接口的对象。
- 如果成员元素是不同类型的,其 Java 表示扩展通用基本类,则列表将包含常见基本类的对象。
-
如果没有满足其他条件,该列表将包含对象
对象
。
生成的 Java 类将仅具有 member 变量的 getter 方法。getter 方法返回对 live 列表的引用。对返回列表所做的任何修改都将对实际对象产生影响。
Java 类使用 @XmlType
注释进行解码。注解的 name
属性设置为 XML Schema 定义中 parent 元素的 name
属性的值。该注解的 propOrder
属性包含代表序列中元素的单个成员变量。
代表所选结构中元素的 member 变量通过 @XmlElements
注释进行解码。@XmlElements
注释包含以逗号分隔的 @XmlElement
注释列表。列表有一个 @XmlElement
注释,适用于类型 XML Schema 定义中定义的每个 member 元素。列表中 @XmlElement
注解的 name
属性设为 XML Schema 元素
元素的 name
属性的值,以及它们的 type
属性设为由 XML Schema 元素类型映射生成的 Java 类。
例 35.19 “使用 Occurrence Constraint 的选择结构的 Java 代表” 显示 例 35.18 “Choice Occurrence Constraints” 中定义的 XML Schema 选择结构的 Java 映射。
例 35.19. 使用 Occurrence Constraint 的选择结构的 Java 代表
@XmlType(name = "ClubEvent", propOrder = { "memberNameOrGuestName" }) public class ClubEvent { @XmlElementRefs({ @XmlElementRef(name = "GuestName", type = JAXBElement.class), @XmlElementRef(name = "MemberName", type = JAXBElement.class) }) protected List<JAXBElement<String>> memberNameOrGuestName; public List<JAXBElement<String>> getMemberNameOrGuestName() { if (memberNameOrGuestName == null) { memberNameOrGuestName = new ArrayList<JAXBElement<String>>(); } return this.memberNameOrGuestName; } }
minOccurs 设为 0
如果只指定
元素,其值为 minOccurs
0,
则代码生成器会生成 Java 类,就像未设置 minOccurs 属性一样。
35.5.4. 元素的出现限制
概述
您可以使用 element
元素的 minOccurs
属性和 maxOccurs
属性来指定复杂类型的特定元素的次数。这两个属性的默认值都是 1
。
minOccurs 设为 0
当您将某个复杂类型的 member 元素的 minOccurs
属性设置为 0
时,则 @XmlElement
注释将改变。不必将其 必需
属性设置为 true
,而是将 @XmlElement
注释 的必需
属性设为 false
。
minOccurs 设置为一个大于 1 的值
在 XML Schema 中,您可以通过将 element
元素的 minOccurs
属性设置为大于一的值来指定元素必须在类型的实例中发生多次。但是,生成的 Java 类将不支持 XML Schema 约束。Apache CXF 生成支持 Java 成员变量,就像未设置 minOccurs
属性一样。
带有 maxOccurs 设置的元素
当希望 member 元素在复杂类型的实例中显示多次时,您可以将元素的 maxOccurs
属性设置为大于 1 的值。您可以将 maxOccurs
属性的值设置为 未绑定
,以指定 member 元素可以出现无限次数。
代码生成器映射一个 maxOccurs
属性设置为值大于 1 到 List<T
> 对象的 Java 成员变量的成员元素。列表的基础类通过将元素的类型映射到 Java 来确定。对于 XML Schema 原语类型,打包程序类使用,如 “打包程序类”一节 所述。例如,如果 member 元素类型为 xsd:int
,则生成的 member 变量是 List<Integer>
对象。
35.5.5. 根据序列的出现限制
概述
默认情况下,序列
元素的内容只能在复杂类型的实例中出现一次。您可以使用 minOccurs
属性及其 maxOccurs
属性来更改 序列
元素定义的元素序列的次数。您可以使用这些属性,可以指定序列类型在复杂类型的实例中可以为零到无限次数。
使用 XML Schema
minOccurs
属性指定在定义的复杂类型的实例中必须进行序列的最小次数。其值可以是任意正整数。将 minOccurs
属性设置为 0
指定序列不需要出现在复杂类型的实例中。
maxOccurs
属性指定在定义的复杂类型的实例中可以进行序列的上限。其值可以是任意非零、正整数或未绑定的 。将
maxOccurs
属性设置为 unbounded
指定序列可能会显示无限次。
例 35.20 “使用 Occurrence 限制序列” 显示序列类型 CultureInfo
的定义,以及顺序出现的限制。序列可以重复 0 到 2 次。
例 35.20. 使用 Occurrence 限制序列
<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 限制序列” 中定义的序列发生两次,则列表会有四个项目。
Java 类的成员变量的名称通过串联 member 元素的名称来派生。元素名称由 和
分隔,变量名称的第一个字母转换为小写。例如,从 例 35.20 “使用 Occurrence 限制序列” 生成的成员变量名为 nameAndLcid
。
存储在列表中的对象类型取决于成员元素的类型。例如:
-
如果成员元素是相同类型,生成的列表将包含
JAXBElement<T>
对象。JAXBElement<T>
; 对象的基础类型由 member 元素类型的普通映射决定。 - 如果成员元素是不同类型的,且其 Java 表示实施了通用接口,则列表将包含常见接口的对象。
- 如果成员元素是不同类型的,其 Java 表示扩展通用基本类,则列表将包含常见基本类的对象。
-
如果没有满足其他条件,该列表将包含对象
对象
。
生成的 Java 类仅具有 member 变量的 getter 方法。getter 方法返回对 live 列表的引用。对返回列表所做的任何修改对实际对象的影响。
Java 类使用 @XmlType
注释进行解码。注解的 name
属性设置为 XML Schema 定义中 parent 元素的 name
属性的值。该注解的 propOrder
属性包含代表序列中元素的单个成员变量。
代表序列中元素的 member 变量通过 @XmlElements
注释进行解码。@XmlElements
注释包含以逗号分隔的 @XmlElement
注释列表。列表有一个 @XmlElement
注释,适用于类型 XML Schema 定义中定义的每个 member 元素。列表中 @XmlElement
注解的 name
属性设为 XML Schema 元素
元素的 name
属性的值,以及它们的 type
属性设为由 XML Schema 元素类型映射生成的 Java 类。
例 35.21 “Java 代表带有 Occurrence Constraint 的序列” 显示 例 35.20 “使用 Occurrence 限制序列” 中定义的 XML Schema 序列的 Java 映射。
例 35.21. Java 代表带有 Occurrence Constraint 的序列
@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 属性一样。