乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • XML 基础语法

    • XML 概述
    • XML 文档结构
    • XML 元素
    • XML 属性
    • XML 语法规则
    • XML 命名空间
    • XML 注释与处理指令
  • DTD 与文档验证

    • DTD 概述
    • DTD 元素声明
    • DTD 属性声明
    • DTD 实体声明
    • DTD 元素与属性对比
    • DTD 完整示例
  • XML Schema 定义

    • XML Schema 概述
    • XSD 简单类型
    • XSD 复杂类型
    • XSD 命名空间与引用
  • XPath 节点定位

    • XPath 概述
    • XPath 路径表达式
    • XPath 谓词与函数
  • XSLT 转换

    • XSLT 概述
    • XSLT 模板与匹配
    • XSLT 控制结构
    • XSLT 输出控制
  • XML 解析技术

    • XML 解析概述
    • DOM 解析
    • SAX 解析
    • StAX 解析
    • XML 与 Java — JAXP
  • XML 在 Java 中的应用

    • Spring XML 配置
    • MyBatis XML 映射
    • pom.xml 与 Maven
    • web.xml 配置详解
  • 现代数据格式对比

    • XML 与 JSON 对比
    • XML 与 YAML 对比
  • XML 显示与浏览器集成

    • XML 在浏览器中的显示
    • XMLHttpRequest 与 AJAX
    • 服务器端 XML 处理
  • XML 进阶查询与链接

    • XQuery 查询语言
    • XLink 超链接
    • XML 验证工具使用
  • XML Web 服务(选读)

    • XML Web 服务概述
    • SOAP 协议详解
    • WSDL 服务描述
    • RSS 内容聚合
    • RDF 资源描述框架

XSD 复杂类型

本章定位 :掌握 XSD 复杂类型(complexType)的定义方式——三种指示器(sequence/choice/all)、出现次数控制(minOccurs/maxOccurs)、属性声明和混合内容。

定义与作用

复杂类型 (complexType)是可以包含子元素和/或属性的类型。在 XSD 中,任何有结构的元素都需要用 complexType 定义——包括包含子元素的复合元素和带属性的纯文本元素。

复杂类型的核心能力:

  1. 定义子元素的顺序和出现次数(通过指示器和 minOccurs/maxOccurs)
  2. 声明元素可以携带的属性
  3. 支持混合内容(同时包含文本和子元素)

核心原理:三种指示器决定子元素结构

图解释 :三种指示器控制子元素的组织方式。sequence 最常用(有序必含),choice 用于"二选一"场景,all 适合"全部含但顺序随意"的简单表单。

语法/结构要点

三种指示器

指示器子元素顺序出现次数限制典型场景
sequence严格按声明顺序任意(minOccurs/maxOccurs)person(name, age, address)
choice只选一个任意联系方式(phone
all任意顺序每个最多 1 次简单表单(name, email, phone)

出现次数控制

属性含义常用值
minOccurs最少出现次数0(可选)、1(必含,默认)
maxOccurs最多出现次数1(默认)、unbounded(无限制)

属性声明

<xs:attribute name="id" type="xs:ID" use="required"/>
<xs:attribute name="category" type="xs:string" use="optional" default="misc"/>
use 值含义
required必须提供
optional可选(默认)
prohibited禁止使用

完整示例:小崔设计订单系统 XSD

场景说明

飞翔科技的后端开发 小崔 被派去设计订单系统的 XML Schema。订单结构比较复杂:有些字段必填,有些二选一(快递地址 vs 自提点),商品数量可变。

操作前:粗糙的 DTD 声明

<!ELEMENT order (items, shipping, billing)>
<!ELEMENT items (item+)>
<!ELEMENT item (name, quantity, price)>
<!-- 无法表达 shipping 和 billing 的复杂结构 -->

操作后:XSD complexType 设计

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="order">
    <xs:complexType>
      <xs:sequence>
        <!-- 商品列表:至少1个 -->
        <xs:element name="items">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="item" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="name" type="xs:string"/>
                    <xs:element name="quantity">
                      <xs:simpleType>
                        <xs:restriction base="xs:integer">
                          <xs:minInclusive value="1"/>
                        </xs:restriction>
                      </xs:simpleType>
                    </xs:element>
                    <xs:element name="price" type="xs:decimal"/>
                  </xs:sequence>
                  <xs:attribute name="sku" type="xs:string" use="required"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>

        <!-- 收货方式:快递 or 自提(二选一) -->
        <xs:element name="delivery">
          <xs:complexType>
            <xs:choice>
              <xs:element name="express">
                <xs:complexType>
                  <xs:all>
                    <xs:element name="address" type="xs:string"/>
                    <xs:element name="city" type="xs:string"/>
                    <xs:element name="zip" type="xs:string"/>
                    <xs:element name="phone" type="xs:string" minOccurs="0"/>
                  </xs:all>
                </xs:complexType>
              </xs:element>
              <xs:element name="pickup">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="store_name" type="xs:string"/>
                    <xs:element name="pickup_time" type="xs:dateTime"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:choice>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="id" type="xs:string" use="required"/>
      <xs:attribute name="status" type="xs:string" default="pending"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

操作结果

符合 Schema 的订单 XML:

<order id="ORD-2024-001" status="pending">
  <items>
    <item sku="XML-101">
      <name>Learning XML</name>
      <quantity>2</quantity>
      <price>39.95</price>
    </item>
  </items>
  <delivery>
    <express>
      <address>天河路100号飞翔科技大厦</address>
      <city>广州</city>
      <zip>510630</zip>
    </express>
  </delivery>
</order>

XSD 确保:①quantity ≥ 1;②收货方式只能是 express 或 pickup 二选一;③express 中 address/city/zip 必填但顺序随意;④status 不填则默认 pending。

易错场景

错误一:混淆 all 和 sequence

<!-- all:子元素顺序任意,每个最多1次 -->
<xs:all>
  <xs:element name="a"/>
  <xs:element name="b"/>
</xs:all>

<!-- sequence:必须按声明顺序出现,可以有多个 -->
<xs:sequence>
  <xs:element name="a" maxOccurs="unbounded"/>
  <xs:element name="b" maxOccurs="unbounded"/>
</xs:sequence>

错误二:maxOccurs 默认值是 1,不是 unbound

<!-- ❌ 若不给 maxOccurs,默认只能出现1次 -->
<xs:element name="item"/>

<!-- ✅ 允许多个 -->
<xs:element name="item" maxOccurs="unbounded"/>

面试考点

考点参考答案要点
sequence、choice、all 的区别?sequence:按序全部;choice:N选一;all:全部但顺序任意,每项最多1次。all 不能嵌套在 sequence 内部
minOccurs 和 maxOccurs 的默认值?默认都是 1。maxOccurs="unbounded" 表示无上限。minOccurs="0" 使元素可选
complexType 如何声明属性?在 complexType 内部的最后使用 <xs:attribute> 声明,`use="required
上一页
XSD 简单类型
下一页
XSD 命名空间与引用