2.5. 定义复杂数据类型

摘要

XML 架构提供了灵活的强大机制,用于从其简单数据类型构建复杂数据结构。您可以通过创建由元素和属性组成的序列来创建数据结构。您还可以扩展您定义的类型,以创建更复杂的类型。

除了构建复杂数据结构外,您还可以描述专用类型,如枚举类型、具有特定范围的值的数据类型,或者通过扩展或限制原语类型需要遵守特定模式的数据类型。

2.5.1. 定义数据结构

概述

在 XML 架构中,作为数据字段集合的数据单元是使用 complexType 元素来定义的。指定复杂类型需要三部分信息:

  1. 定义的类型的名称在 complexType 元素的 name 属性中指定。
  2. complexType 的第一个子元素描述了当 structure 字段在线路上时的行为。请参阅 “复杂的类型 varieties”一节
  3. 定义结构的每个字段都在作为 complexType 元素的 Getndchildren 的元素中定义。请参阅 “定义结构的部分”一节

例如,在 XML 架构中作为带有两个元素的复杂类型来定义 例 2.3 “简单结构” 中的结构。

例 2.3. 简单结构

struct personalInfo
{
  string name;
  int age;
};

例 2.4 “复杂类型” 显示 例 2.3 “简单结构” 中显示的结构的可能 XML 架构映射,在 例 2.4 “复杂类型” 中定义的结构会生成包含两个元素: nameage 的消息。

.

例 2.4. 复杂类型

<complexType name="personalInfo">
  <sequence>
    <element name="name" type="xsd:string" />
    <element name="age" type="xsd:int" />
  </sequence>
</complexType>

复杂的类型 varieties

XML 架构有三种方法来描述复杂类型的字段在以 XML 文档表示并用线路传递时的方式。complexType 元素的第一个子元素决定使用哪些复杂类型。表 2.1 “复杂的类型描述符元素” 显示用于定义复杂类型行为的元素。

表 2.1. 复杂的类型描述符元素

元素复杂的类型行为

序列

所有复杂类型的字段都可以存在,且它们必须按类型定义中指定的顺序。

all

所有复杂的类型字段都可以存在,但可以按任何顺序排列。

choice

只有结构中的其中一个元素可以放在消息中。

如果使用 选择 元素定义结构,如 例 2.5 “简单复杂的选择类型” 所示,它将生成一个包含 name 元素或 age 元素的消息。

例 2.5. 简单复杂的选择类型

<complexType name="personalInfo">
  <choice>
    <element name="name" type="xsd:string"/>
    <element name="age" type="xsd:int"/>
  </choice>
</complexType>

定义结构的部分

您可以使用 元素元素 定义组成结构的数据字段。每个 complexType 元素都应该至少包含一个 元素complexType 元素 中的每个元素代表定义的数据结构中的一个字段。

要完全描述数据结构中的字段,元素 元素有两个所需的属性:

  • name 属性指定 data 字段的名称,它在定义的复杂类型中必须是唯一的。
  • type 属性指定字段中存储的数据类型。类型可以是 XML 架构简单类型之一,也可以是在合同中定义的任何指定复杂类型。

除了名称和类型外,元素元素 还有两个常用的可选属性: minOcurrsmaxOccurs 这些属性根据字段在结构中发生的次数进行绑定。默认情况下,每个字段仅在复杂类型中执行一次。使用这些属性,您可以更改字段必须或可以在结构中显示的次数。例如,您可以定义一个字段 previousJobs,它必须至少发生三次,且不超过七次,如 例 2.6 “具有发生限制的简单复杂类型” 所示。

例 2.6. 具有发生限制的简单复杂类型

<complexType name="personalInfo">
  <all>
    <element name="name" type="xsd:string"/>
    <element name="age" type="xsd:int"/>
    <element name="previousJobs" type="xsd:string:
             minOccurs="3" maxOccurs="7"/>
  </all>
</complexType>

您还可以通过将 minOccurs 设置为 0,使用 minOccurs 来指定 age 字段是可选的,如 例 2.7 “简单的复杂类型,将 minOccurs 设为零” 所示。在这种情况下,可以省略这些 年龄,数据仍将有效。

例 2.7. 简单的复杂类型,将 minOccurs 设为零

<complexType name="personalInfo">
  <choice>
    <element name="name" type="xsd:string"/>
    <element name="age" type="xsd:int" minOccurs="0"/>
  </choice>
</complexType>

定义属性

在 XML 文档中,属性包含在元素的标签中。例如,在下面的代码中的 complexType 元素中,name 是属性。要为复杂类型指定属性,您可以在 complexType 元素定义中定义 属性 元素。属性 元素只能在 所有序列 或选择元素 后显示。为每个复杂类型的属性指定一个 属性 元素。任何 属性 元素都必须是 complexType 元素的直接子项。

例 2.8. 具有属性的复杂类型

<complexType name="personalInfo">
  <all>
    <element name="name" type="xsd:string"/>
    <element name="previousJobs" type="xsd:string"
             minOccurs="3" maxOccurs="7"/>
  </all>
  <attribute name="age" type="xsd:int" use="required" />
</complexType>

在前面的代码中,attribute 元素指定 personalInfo 复杂类型具有 age 属性。attribute 元素具有这些属性:

  • Name - 指定用于标识属性的字符串的必需属性。
  • Type - 指定存储在字段中的数据类型。这个类型可以是 XML 架构简单类型之一。
  • 使用 - 指定具有此属性时是否需要复杂类型的可选属性。有效值 是必需的可选。默认值是 属性是可选的。

attribute 元素中,您可以指定可选的 default 属性,它允许您指定属性的默认值。