35.5. 发生约束


35.5.1. 模式元素支持 Occurrence 约束

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

35.5.2. 在 All Element 上发生限制

XML Schema

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

映射到 Java

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

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

概述

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

在 XML 架构中使用

minOccurs 属性指定必须显示所选类型的最小次数。其值可以是任意正整数。将 minOccurs 属性设置为 0, 指定选择类型不需要显示在复杂类型的实例中。

maxOccurs 属性指定选择类型可以显示的最大次数。其值可以是任何非零、正整数或 未绑定 的值。将 maxOccurs 属性设置为 unbounded 指定选择类型可以显示无限次数。

例 35.18 “选择观察约束” 显示选择类型 ClubEvent 的定义,并有选择发生的限制。选择类型 overall 可以重复 0 到未绑定的时间。

例 35.18. 选择观察约束

<complexType name="ClubEvent">
  <choice minOccurs="0" maxOccurs="unbounded">
    <element name="MemberName" type="xsd:string"/>
    <element name="GuestName" type="xsd:string"/>
  </choice>
</complexType>
Copy to Clipboard Toggle word wrap

映射到 Java

与单实例选择结构不同,可以多次实现的 XML 架构选择结构映射到具有单个成员变量的 Java 类。这个单一成员变量是一个 List<T > 对象,其中包含序列多次出现的所有数据。例如:如果 例 35.18 “选择观察约束” 中定义的序列发生两次,则列表将有两个项目。

Java 类的成员变量的名称通过串联 member 元素的名称来派生。元素名称以 Or 分隔,变量名称的第一个字母将转换为小写。例如,从 例 35.18 “选择观察约束” 生成的 member 变量将命名为 memberNameOrGuestName

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

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

生成的 Java 类将只有 member 变量的 getter 方法。getter 方法返回对 live 列表的引用。对返回列表所做的任何修改都将影响实际对象。

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

代表选择结构中的元素的 member 变量使用 @XmlElements 注释进行解码。@XmlElements 注释包含以逗号分隔的 @XmlElement 注释列表。该列表具有一个 @XmlElement 注释,用于类型 XML 架构定义中定义的每个 member 元素。列表中 @XmlElement 注释的 name 属性设为 XML Schema 元素的 name 属性的值,其 type 属性设置为由 XML Schema 元素类型映射生成的 Java 类。

例 35.19 “使用 Occurrence 约束的 Java 代表选择结构” 显示 例 35.18 “选择观察约束” 中定义的 XML 架构选择结构的 Java 映射。

例 35.19. 使用 Occurrence 约束的 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;
    }

}
Copy to Clipboard Toggle word wrap

minOccurs 设置为 0

如果只指定 minOccurs 元素,其值为 0,则代码生成器会生成 Java 类,就像未设置 minOccurs 属性一样。

35.5.4. 元素上发生约束

概述

您可以使用元素元素的 minOccurs 属性和 maxOccurs 属性指定复杂类型中特定元素的次数。这两个属性的默认值为 1

minOccurs 设置为 0

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

minOccurs 设置为大于 1 的值

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

带有 maxOccurs 设置的元素

当您希望 member 元素在复杂类型的实例中出现多次时,您可以将元素的 maxOccurs 属性设置为大于 1 的值。您可以将 maxOccurs 属性的值设置为 unbounded,以指定 member 元素可以显示无限次数。

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

35.5.5. 序列发生的限制

概述

默认情况下,sequence 元素的内容只能在复杂类型的实例中出现一次。您可以更改序列元素定义的元素序列的次数,允许使用其 minOccurs 属性及其 maxOccurs 属性。通过使用这些属性,您可以指定序列类型在复杂类型的实例中可能会为零到无限次数。

使用 XML 架构

minOccurs 属性指定定义复杂类型的实例中必须执行序列的最小次数。其值可以是任意正整数。将 minOccurs 属性设置为 0, 指定序列不需要显示在复杂类型的实例中。

maxOccurs 属性指定定义复杂类型的实例中可以发生序列的次数上限。其值可以是任何非零、正整数或 未绑定 的值。将 maxOccurs 属性设置为 unbounded 指定序列可能会显示无限次数。

例 35.20 “使用 Occurrence 约束序列” 显示序列类型的定义,Culture Info,带有序列发生的限制。序列可以重复 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>
Copy to Clipboard Toggle word wrap

映射到 Java

与单个实例序列不同,可以多次发生的 XML 架构序列使用单个成员变量映射到 Java 类。这个单一成员变量是一个 List<T > 对象,其中包含序列多次出现的所有数据。例如,如果 例 35.20 “使用 Occurrence 约束序列” 中定义的序列发生两次,则列表将有四个项目。

Java 类的成员变量的名称通过串联 member 元素的名称来派生。元素名称由 And 分隔,变量名称的第一个字母将转换为小写。例如,从 例 35.20 “使用 Occurrence 约束序列” 生成的 member 变量名为 nameAndLcid

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

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

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

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

代表序列中的元素的 member 变量使用 @XmlElements 注释进行解码。@XmlElements 注释包含以逗号分隔的 @XmlElement 注释列表。该列表具有一个 @XmlElement 注释,用于类型 XML 架构定义中定义的每个 member 元素。列表中 @XmlElement 注释的 name 属性设为 XML Schema 元素的 name 属性的值,其 type 属性设置为由 XML Schema 元素类型映射生成的 Java 类。

例 35.21 “带有 Occurrence 约束的 Java 代表序列” 显示 例 35.20 “使用 Occurrence 约束序列” 中定义的 XML 架构序列的 Java 映射。

例 35.21. 带有 Occurrence 约束的 Java 代表序列

@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;
    }

}
Copy to Clipboard Toggle word wrap

minOccurs 设置为 0

如果只指定 minOccurs 元素,其值为 0,则代码生成器会生成 Java 类,就像未设置 minOccurs 属性一样。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat