35.5. 发生限制

35.5.1. 模式元素支持限制

XML 架构允许您在组成复杂类型定义的四个 XML 架构元素中指定发生限制:

35.5.2. All Element 上的冲突限制

XML 架构

通过 all 元素定义的复杂类型不允许所有元素定义的结构出现多次。但是,您可以通过将 minOccurs 属性设置为 0 来为 all 元素定义的结构。

映射到 Java

all 元素的 minOccurs 属性设为 0 对生成的 Java 类没有影响。

35.5.3. 对选择元素的发生限制

概述

默认情况下,选择 元素的结果只能出现在复杂类型的实例中一次。您可以通过 minOccurs 属性及其 mxOccurs 属性来更改 选择 元素定义的结构的次数。通过使用这些属性,您可以指定选择类型可能会为零到复杂类型的实例中无限次。为选择类型选择的元素并不需要在每次发生次数时相同。

在 XML 架构中使用

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 架构选择结构会多次映射到具有单个成员变量的 Java 类。这个单一成员变量是一个 List<T > 对象,其中包含序列多次出现的所有数据。例如:如果 例 35.18 “Choice Occurrence Constraints” 中定义的序列出现两次,则列表会有两个项目。

Java 类的成员变量的名称通过串联成员元素的名称来派生。元素名称由 Or 分隔,变量名称的第一个字母会被转换为小写。例如,从 例 35.18 “Choice Occurrence Constraints” 生成的成员变量将命名为 memberNameOrGuestName

列表中存储的对象类型取决于成员元素的类型。例如:

  • 如果生成的列表位于同一类型的成员元素,则生成的列表将包含 JAXBElement<T> 对象。JAXBElement<T&gt; 对象的基本类型由 member 元素类型的典型映射决定。
  • 如果成员元素是不同的类型,并且它们的 Java 表示实施了通用接口,则列表将包含通用接口的对象。
  • 如果成员元素是不同的类型,并且它们的 Java 表示扩展了一个通用的基础类,则列表将包含常见基础类的对象。
  • 如果没有满足其他条件,则列表将包含对象 对象

生成的 Java 类将仅具有 member 变量的 getter 方法。getter 方法返回对实时列表的引用。对返回的列表进行的任何修改都将影响实际对象。

Java 类与 @XmlType 注释进行解码。注解的 name 属性设置为 XML 架构定义的父元素中的 name 属性的值。该注解的 propOrder 属性包含代表序列中的元素的单个成员变量。

代表选择结构中的成员变量通过 @XmlElements 注释来解码。@XmlElements 注释包含以逗号分隔的 @XmlElement 注释列表。该列表具有一个 @XmlElement 注释,用于类型 XML 架构定义中定义的每个成员元素。列表中 @XmlElement 注释的 name 属性设为 XML Schema 元素name 属性的值,它们 类型 属性设置为 Java 类,从 XML Schema 元素 元素类型映射而生成的 Java 类。

例 35.19 “Java 代表带有 Occurrence Constraint 的选择结构” 显示 例 35.18 “Choice Occurrence Constraints” 中定义的 XML 架构选择结构的 Java 映射。

例 35.19. Java 代表带有 Occurrence Constraint 的选择结构

@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. 元素出现冲突限制

概述

您可以使用 elementminOccurs 属性和 maxOccurs 属性指定复杂类型中特定元素的多次。两个属性的默认值都是 1

minOccurs 设置为 0

当您将复杂类型的 member 元素的 minOccurs 属性设置为 0 时,@XmlElement 注解会改变对应的 Java 成员变量。@XmlElement 注释的 required 属性设置为 false,而不是将其 required 属性设置为 true

minOccurs 设置为大于 1 的值

在 XML 架构中,您可以通过将元素的 minOccurs 属性设置为大于一来,指定元素的 minOccurs 属性必须在类型的实例中多次发生。但是,生成的 Java 类不支持 XML 架构约束。Apache CXF 生成支持 Java 成员变量,就像未设置 minOccurs 属性一样。

带有 maxOccurs 集的元素

当希望一个成员元素在复杂类型的实例中显示多次时,您要将元素的 maxOccurs 属性设置为值大于 1。您可以将 maxOccurs 属性的值设置为 unbound,以指定 member 元素可能会显示为无限次数。

代码生成器将 maxOccurs 属性设为值大于 1 的成员元素映射到 List<T > 对象的 Java 成员变量。列表中的基础类由将元素类型映射到 Java 来确定。对于 XML 架构原语类型,使用打包程序类,如 “打包程序类”一节 所述。例如,如果 member 元素类型为 xsd:int,则生成的 member 变量是一个 List<Integer> 对象。

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&gt; 对象的基本类型由 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 属性一样。