XML Schema 复杂元素类型详解:定义及示例解析


XML Schema(XSD)中的复杂元素类型用于定义具有子元素和属性的元素结构。复杂元素类型是XML Schema的核心概念之一,可以通过多种方式进行定义,以适应不同的数据建模需求。以下是对复杂元素类型的详细解释及示例解析。

复杂元素类型定义

复杂元素类型可以通过<xs:complexType>元素进行定义。主要包括以下几种形式:

  1. 仅包含子元素的复杂类型
  2. 仅包含属性的复杂类型
  3. 同时包含子元素和属性的复杂类型

1. 仅包含子元素的复杂类型

这是最常见的复杂类型,包含其他元素作为子元素。

示例

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="person">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="firstName" type="xs:string"/>
        <xs:element name="lastName" type="xs:string"/>
        <xs:element name="age" type="xs:int"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

解析

  • <xs:sequence>定义了子元素的顺序。
  • <xs:element>定义了具体的子元素及其类型。

实例文档

<person>
  <firstName>John</firstName>
  <lastName>Doe</lastName>
  <age>30</age>
</person>

2. 仅包含属性的复杂类型

这种类型的复杂元素仅包含属性,没有子元素。

示例

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="person">
    <xs:complexType>
      <xs:attribute name="firstName" type="xs:string"/>
      <xs:attribute name="lastName" type="xs:string"/>
      <xs:attribute name="age" type="xs:int"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

解析

  • <xs:attribute>定义了元素的属性及其类型。

实例文档

<person firstName="John" lastName="Doe" age="30"/>

3. 同时包含子元素和属性的复杂类型

这种类型的复杂元素既包含子元素,又包含属性。

示例

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="person">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="firstName" type="xs:string"/>
        <xs:element name="lastName" type="xs:string"/>
        <xs:element name="age" type="xs:int"/>
      </xs:sequence>
      <xs:attribute name="id" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

解析

  • <xs:sequence>定义了子元素的顺序。
  • <xs:attribute>定义了元素的属性及其类型,use="required"表示该属性是必需的。

实例文档

<person id="123">
  <firstName>John</firstName>
  <lastName>Doe</lastName>
  <age>30</age>
</person>

复杂类型的其他特性

使用<xs:choice>

<xs:choice>元素允许在多个子元素中选择一个。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="contact">
    <xs:complexType>
      <xs:choice>
        <xs:element name="phone" type="xs:string"/>
        <xs:element name="email" type="xs:string"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

实例文档

<contact>
  <phone>123-456-7890</phone>
</contact>

或者

<contact>
  <email>john.doe@example.com</email>
</contact>

使用<xs:all>

<xs:all>元素表示子元素可以以任意顺序出现,但每个子元素只能出现一次。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="person">
    <xs:complexType>
      <xs:all>
        <xs:element name="firstName" type="xs:string"/>
        <xs:element name="lastName" type="xs:string"/>
        <xs:element name="age" type="xs:int"/>
      </xs:all>
    </xs:complexType>
  </xs:element>
</xs:schema>

实例文档

<person>
  <lastName>Doe</lastName>
  <firstName>John</firstName>
  <age>30</age>
</person>

定义全局复杂类型

可以定义全局复杂类型,然后在元素中引用。

示例

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="personType">
    <xs:sequence>
      <xs:element name="firstName" type="xs:string"/>
      <xs:element name="lastName" type="xs:string"/>
      <xs:element name="age" type="xs:int"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:element name="person" type="personType"/>
</xs:schema>

实例文档

<person id="123">
  <firstName>John</firstName>
  <lastName>Doe</lastName>
  <age>30</age>
</person>

小结

通过以上示例和解释,我们了解了XML Schema中定义复杂元素类型的几种方式,包括仅包含子元素、仅包含属性以及同时包含子元素和属性的复杂类型。还学习了如何使用<xs:choice><xs:all>来定义具有特定规则的复杂元素,以及如何定义全局复杂类型并在元素中引用。通过这些技术,你可以灵活地定义XML文档的结构,以满足不同的应用需求。


原文链接:codingdict.net