搜索

第 35 章 使用复杂类型

download PDF

摘要

复杂的类型可以包含多个元素,它们可以具有属性。它们映射到 Java 类中,可保存类型定义所代表的数据。通常,映射是包含一组代表元素的属性和内容模型属性的 bean。

35.1. 基本复杂度类型映射

概述

XML Schema 复杂的类型定义构造包含比简单类型更复杂的信息。最简单的复杂类型使用 属性定义一个空元素。更复杂的类型由一系列元素组成。

默认情况下,XML Schema 复杂类型映射到 Java 类,其成员变量代表 XML Schema 定义中列出的每个元素和属性。类为每个成员变量设置了 setters 和 getters。

在 XML Schema 中定义

XML Schema 复杂类型使用 complexType 元素进行定义。complexType 元素嵌套了用于定义数据结构的其余元素。它可显示为指定类型定义的父元素,或者作为元素的子元素来匿名定义存储在元素中的信息结构。当使用 complexType 元素来定义指定类型时,它需要使用 name 属性。name 属性指定引用该类型的唯一标识符。

包含一个或多个元素的复杂类型定义具有 表 35.1 “在复杂类型中定义如何元素” 中描述的其中一个子元素。这些元素决定了指定的元素在类型的实例中如何。

表 35.1. 在复杂类型中定义如何元素
element描述

all

定义为复杂类型的一部分定义的所有元素都必须显示在类型的实例中。但是,它们可以以任何顺序出现。

choice

只有一个元素定义为复杂类型的一部分,才能出现在类型的实例中。

sequence

定义为复杂类型的一部分定义的所有元素都必须显示在类型的实例中,它们也必须按照类型定义中指定的顺序出现。

注意

如果复杂的类型定义只使用属性,则不需要 表 35.1 “在复杂类型中定义如何元素” 中描述的一个元素。

确定元素的出现方式后,您可以通过向定义中添加一个或多个 元素 子项来定义元素。

例 35.1 “XML Schema complex 类型” 在 XML Schema 中显示复杂的类型定义。

例 35.1. XML Schema complex 类型

<complexType name="sequence">
  <sequence>
    <element name="name" type="xsd:string" />
    <element name="street" type="xsd:short" />
    <element name="city" type="xsd:string" />
    <element name="state" type="xsd:string" />
    <element name="zipCode" type="xsd:string" />
  </sequence>
</complexType>

映射到 Java

XML 架构复杂类型映射到 Java 类。复杂类型定义中的每个元素都映射到 Java 类中的成员变量。getter 和 setter 方法也为复杂类型中的每个元素生成。

所有生成的 Java 类都使用 @XmlType 注释进行解码。如果映射用于复杂类型,则注解名称设置为 complexType 元素的 name 属性的值。如果将复杂类型定义为元素定义的一部分,则 @XmlType 注释的 name 属性的值是 element 元素的 name 属性的值。

注意

“带有在线类型的元素的 Java 映射”一节 所述,如果为定义为元素定义的复杂类型生成了 @XmlRootElement 注释,生成的类被解码。

为了提供运行时准则,指示应该如何处理 XML Schema 的元素,代码生成器会改变用于分离类及其成员变量的注解。

所有复杂度类型

所有复杂的类型都使用 all 元素来定义。它们按如下方式标注:

  • @XmlType 注释的 propOrder 属性为空。
  • 每个元素使用 @XmlElement 注释进行解码。
  • @XmlElement 注释 的必需 属性设置为 true

    例 35.2 “All Complex Type 的映射” 显示所有复杂类型的映射,其中有两个元素。

    例 35.2. All Complex Type 的映射

    @XmlType(name = "all", propOrder = {
    
    })
    public class All {
        @XmlElement(required = true)
        protected BigDecimal amount;
        @XmlElement(required = true)
        protected String type;
    
        public BigDecimal getAmount() {
            return amount;
        }
    
        public void setAmount(BigDecimal value) {
            this.amount = value;
        }
    
        public String getType() {
            return type;
        }
    
        public void setType(String value) {
            this.type = value;
        }
    }
Choice Complex Type

使用选择元素定义 选择 复杂类型。它们按如下方式标注:

  • @XmlType 注释的 propOrder 属性按照 XML Schema 定义中显示的顺序列出元素的名称。
  • 没有注解成员变量。

    例 35.3 “选择复杂度类型的映射” 显示了选择复杂的类型的映射,其中有两个元素。

    例 35.3. 选择复杂度类型的映射

    @XmlType(name = "choice", propOrder = {
        "address",
        "floater"
    })
    public class Choice {
    
        protected Sequence address;
        protected Float floater;
    
        public Sequence getAddress() {
            return address;
        }
    
        public void setAddress(Sequence value) {
            this.address = value;
        }
    
        public Float getFloater() {
            return floater;
        }
    
        public void setFloater(Float value) {
            this.floater = value;
        }
    
    }
序列复杂度类型

使用序列元素定义 序列 复杂类型。它标明如下:

  • @XmlType 注释的 propOrder 属性按照 XML Schema 定义中显示的顺序列出元素的名称。
  • 每个元素使用 @XmlElement 注释进行解码。
  • @XmlElement 注释 的必需 属性设置为 true

    例 35.4 “序列复杂度类型的映射” 显示 例 35.1 “XML Schema complex 类型” 中定义的复杂类型的映射。

    例 35.4. 序列复杂度类型的映射

    @XmlType(name = "sequence", propOrder = {
        "name",
        "street",
        "city",
        "state",
        "zipCode"
    })
    public class Sequence {
    
        @XmlElement(required = true)
        protected String name;
        protected short street;
        @XmlElement(required = true)
        protected String city;
        @XmlElement(required = true)
        protected String state;
        @XmlElement(required = true)
        protected String zipCode;
    
        public String getName() {
            return name;
        }
    
        public void setName(String value) {
            this.name = value;
        }
    
        public short getStreet() {
            return street;
        }
    
        public void setStreet(short value) {
            this.street = value;
        }
    
        public String getCity() {
            return city;
        }
    
        public void setCity(String value) {
            this.city = value;
        }
    
        public String getState() {
            return state;
        }
    
        public void setState(String value) {
            this.state = value;
        }
    
        public String getZipCode() {
            return zipCode;
        }
    
        public void setZipCode(String value) {
            this.zipCode = value;
        }
    }
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.