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 属性一样。