XML Schema 教程

XML Schema 教程

XML Schema(简称 XSD,XML Schema Definition)是描述 XML 文档结构和约束的标准语言,是 DTD 的现代替代方案。

本教程包含

  • 基础篇:简介、为什么使用、如何使用
  • 元素篇:schema 元素、简易元素、属性、限定
  • 类型篇:复合元素、复合类型、指示器、替换
  • 数据篇:字符串/日期/数值数据类型、参考手册

学习目标

掌握 XSD 定义元素、属性、类型与约束的语法,能为 XML 文档编写校验规则,理解 XML 数据建模。

核心优势

  • 基于 XML 语法,可编程处理
  • 支持数据类型与命名空间
  • 比 DTD 更强大、可扩展
  • W3C 标准,工具支持广泛

XML Schema 简介

XML Schema 简介

XML Schema 于 2001 年成为 W3C 推荐标准,用于定义 XML 文档的结构、内容和数据类型。

XML Schema 能做什么

  • 定义文档中允许出现的元素和属性
  • 定义元素的顺序和次数
  • 定义元素和属性的数据类型
  • 设置默认值和固定值
  • 定义数据约束(长度、范围、枚举等)
  • 支持命名空间,便于模块化

Schema vs DTD

特性DTDXML Schema
语法非 XMLXML
数据类型有限(PCDATA)丰富(字符串/数字/日期)
命名空间不支持支持
扩展性弱强
现状传统现代标准

简单示例

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="note">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="to" type="xs:string"/>
        <xs:element name="body" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

为什么使用 XML Schema?

为什么使用 XML Schema?

XML Schema 解决了 DTD 的诸多局限,是数据交换场景的标准选择。

主要理由

  1. 数据类型丰富:内置 44+ 种数据类型,支持自定义
  2. 数据校验强:长度、范围、模式、枚举等约束
  3. 命名空间:支持模块化、避免命名冲突
  4. 面向对象:类型可继承(extension/restriction)
  5. 可读可编程:Schema 本身是 XML,可用工具处理

实际应用场景

  • Web 服务:SOAP/WSDL 用 XSD 描述消息格式
  • 配置文件:校验 XML 配置的合法性
  • 数据交换:B2B(电子数据交换)格式约定
  • 文档校验:出版社、电商的文档结构规范

示例:校验订单

<xs:element name="order">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="id" type="xs:integer"/>
      <xs:element name="amount" type="xs:decimal"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

错误类型的数据(如 id 传字符串)在解析阶段就会被拦截。

如何使用 XML Schema

如何使用 XML Schema

一个 XML 文档通过根元素的 xsi:schemaLocation 属性关联 Schema 文件。

关联 Schema

<?xml version="1.0"?>
<note xmlns="http://example.com/note"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://example.com/note note.xsd">
  <to>Alice</to>
  <body>你好!</body>
</note>

schemaLocation 语法

xsi:schemaLocation="命名空间URI 实际Schema文件位置"

校验工具

# xmllint(Linux/macOS 自带)
xmllint --noout --schema note.xsd note.xml

# Python lxml
from lxml import etree
schema = etree.XMLSchema(etree.parse("note.xsd"))
doc = etree.parse("note.xml")
print(schema.validate(doc))   # True/False

Java 校验

import javax.xml.validation.*;
SchemaFactory factory = SchemaFactory.newInstance(
    "http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema(new File("note.xsd"));

IDE 支持

VS Code(XML 扩展)、IntelliJ、Eclipse 都支持 XSD 编写和实时校验。

XML Schema 元素

XML Schema 元素

xs:schema 是 XSD 文档的根元素,声明命名空间和全部定义。

根元素结构

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://example.com/shop"
           elementFormDefault="qualified">

  <!-- 全局元素和类型定义 -->
  <xs:element name="product" type="xs:string"/>

</xs:schema>

根元素常用属性

targetNamespace      目标命名空间,Schema 定义的类型所属
elementFormDefault   是否限定局部元素(qualified/unqualified)
attributeFormDefault 局部属性限定
version              Schema 版本

引用方式

# 简化写法(本教程常用,不含命名空间)
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  ...
</xs:schema>

元素属性

<xs:element name="age" type="xs:integer">
  <xs:annotation>
    <xs:documentation>年龄,必填</xs:documentation>
  </xs:annotation>
</xs:element>
  • name:元素名
  • type:数据类型
  • ref:引用全局元素
  • minOccurs/maxOccurs:出现次数
  • default/fixed:默认值/固定值

XSD 简易元素

XSD 简易元素

简易元素只包含文本内容,不包含子元素和属性,是 XML Schema 的基础单元。

定义简易元素

<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="price" type="xs:decimal"/>

对应 XML

<name>Alice</name>
<age>25</age>
<price>99.90</price>

内置简单类型

xs:string        字符串
xs:integer       整数
xs:decimal       小数
xs:boolean       布尔(true/false)
xs:date          日期(YYYY-MM-DD)
xs:time          时间
xs:dateTime      日期时间
xs:float/double  浮点

默认值与固定值

<xs:element name="color" type="xs:string" default="red"/>
<!-- XML 省略时使用默认值 red -->

<xs:element name="country" type="xs:string" fixed="CN"/>
<!-- 只能为 CN,否则校验失败 -->

注意

简易元素不能有属性;如果元素既有文本又有属性或子元素,必须定义为复合类型。

XML Schema 属性

XML Schema 属性

属性通过 xs:attribute 定义,必须声明在复合类型内部。

定义属性

<xs:element name="user">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:integer"/>
    <xs:attribute name="lang" type="xs:string" default="zh"/>
    <xs:attribute name="status" type="xs:string" fixed="active"/>
  </xs:complexType>
</xs:element>

属性必填

<xs:attribute name="id" type="xs:integer" use="required"/>
<!-- use: required 必填 / optional 可选(默认) / prohibited 禁止 -->

对应 XML

<user id="1001">
  <name>Alice</name>
</user>

属性的限定

<xs:attribute name="age">
  <xs:simpleType>
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="150"/>
    </xs:restriction>
  </xs:simpleType>
</xs:attribute>

全局属性引用

<xs:attribute name="lang" type="xs:string"/>   <!-- 全局定义 -->
...
<xs:attribute ref="lang"/>                        <!-- 引用 -->

XML Schema 限定 / Facets

XML Schema 限定(Facets)

限定(Facets)通过 simpleType + restriction 对数据内容施加约束。

值的范围限定

<xs:simpleType name="ageType">
  <xs:restriction base="xs:integer">
    <xs:minInclusive value="0"/>
    <xs:maxInclusive value="120"/>
  </xs:restriction>
</xs:simpleType>

<xs:element name="age" type="ageType"/>

长度限定

<xs:restriction base="xs:string">
  <xs:minLength value="2"/>
  <xs:maxLength value="10"/>
</xs:restriction>

枚举限定

<xs:restriction base="xs:string">
  <xs:enumeration value="低"/>
  <xs:enumeration value="中"/>
  <xs:enumeration value="高"/>
</xs:restriction>

模式限定(正则)

<xs:restriction base="xs:string">
  <xs:pattern value="[a-z]{3,8}"/>   <!-- 3-8位小写字母 -->
</xs:restriction>

<xs:restriction base="xs:string">
  <xs:pattern value="1[3-9][0-9]{9}"/>  <!-- 中国手机号 -->
</xs:restriction>

常用 Facet 汇总

minInclusive / maxInclusive  范围(含边界)
minExclusive / maxExclusive  范围(不含边界)
minLength / maxLength        长度
length                       固定长度
enumeration                  枚举
pattern                      正则模式
totalDigits / fractionDigits 数字位数
whiteSpace                   空白处理

XML Schema 复合元素

XML Schema 复合元素

复合元素包含子元素或属性,通过 xs:complexType 定义。

空元素(只有属性)

<xs:element name="img">
  <xs:complexType>
    <xs:attribute name="src" type="xs:string" use="required"/>
    <xs:attribute name="alt" type="xs:string"/>
  </xs:complexType>
</xs:element>

<!-- XML: <img src="logo.png" alt="Logo"/> -->

只含元素的复合元素

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

含文本和子元素的复合元素

<xs:element name="description">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="lang" type="xs:string"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

<!-- XML: <description lang="zh">产品描述</description> -->

复合类型使用

type="complexType名"  或 内联 <xs:complexType>

XML Schema 复合空元素

XML Schema 复合空元素

空元素没有内容,只有属性,是最简单的复合元素。

定义空元素

<xs:element name="product">
  <xs:complexType>
    <xs:attribute name="sku" type="xs:string" use="required"/>
    <xs:attribute name="price" type="xs:decimal"/>
  </xs:complexType>
</xs:element>

合法 XML

<product sku="A-1001" price="49.90"/>
<product sku="A-1002"/>

与简易元素的区别

简易元素:有文本,无属性
空复合元素:无文本,有属性

常见用途

  • <img src="..." alt="..."/>
  • <input type="text" name="user"/>
  • <hr width="100%"/>
  • 配置项开关:<feature enabled="true"/>

指定类型的空元素

<xs:complexType name="emptyType">
  <xs:attribute name="id" type="xs:integer"/>
</xs:complexType>

<xs:element name="tag" type="emptyType"/>

XML Schema 复合类型 - 仅含元素

XML Schema 复合类型(仅含元素)

定义只包含子元素、不含文本内容的复合类型,可以按顺序或任意组合。

sequence(按顺序)

<xs:element name="address">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="street" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="zip" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

all(任意顺序)

<xs:complexType>
  <xs:all>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="email" type="xs:string"/>
  </xs:all>
</xs:complexType>
<!-- 三个元素任意顺序,都必须出现一次 -->

choice(多选一)

<xs:complexType>
  <xs:choice>
    <xs:element name="phone" type="xs:string"/>
    <xs:element name="email" type="xs:string"/>
  </xs:choice>
</xs:complexType>
<!-- 只能出现其中之一 -->

出现次数控制

<xs:element name="item" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<!-- 0 次到无限次 -->

命名类型复用

<xs:complexType name="addressType">...</xs:complexType>
<xs:element name="home" type="addressType"/>
<xs:element name="office" type="addressType"/>

XML Schema 复合元素 - 仅含文本

XML Schema 复合元素(仅含文本)

既有文本内容又有属性的元素,通过 simpleContent 定义。

基本结构

<xs:element name="shoesize">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:integer">
        <xs:attribute name="country" type="xs:string"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

合法 XML

<shoesize country="CN">42</shoesize>

extension vs restriction

simpleContent + extension:   在基础类型上扩展属性
simpleContent + restriction: 限制基础类型+添加属性

restriction 示例

<xs:element name="rating">
  <xs:complexType>
    <xs:simpleContent>
      <xs:restriction base="xs:integer">
        <xs:minInclusive value="1"/>
        <xs:maxInclusive value="5"/>
        <xs:attribute name="type" type="xs:string"/>
      </xs:restriction>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>
<!-- XML: <rating type="star">4</rating> -->

使用场景

  • 带单位的数值:<length unit="cm">180</length>
  • 带语言标记的文本:<title lang="zh">标题</title>
  • 带货币的金额:<price currency="CNY">99</price>

XML Schema 复合类型 - 混合内容

XML Schema 复合类型(混合内容)

混合内容类型允许元素同时包含文本和子元素,用 mixed="true" 启用。

定义混合内容

<xs:element name="letter">
  <xs:complexType mixed="true">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="date" type="xs:date"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

合法 XML(文本与元素混排)

<letter>
  亲爱的
  <name>Alice</name>
  你好,今天是
  <date>2026-08-18</date>
  祝好!
</letter>

典型场景

<p>这是一段带有 <b>加粗</b> 和 <i>斜体</i> 的文本</p>
<html><body>富文本内容</body></html>

定义 HTML 样式混合内容

<xs:element name="p">
  <xs:complexType mixed="true">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="b" type="xs:string"/>
      <xs:element name="i" type="xs:string"/>
      <xs:element name="a" type="xs:string"/>
    </xs:choice>
  </xs:complexType>
</xs:element>

注意

混合内容校验规则较宽松,实际项目中应谨慎使用,尽量用结构化元素替代自由混排。

XML Schema 指示器

XML Schema 指示器

指示器(Indicators)控制元素在文档中出现的方式:顺序、选择或任意。

七种指示器

顺序类:  all / choice / sequence
出现次数: minOccurs / maxOccurs
组:      Group name / attributeGroup name

Order 指示器

<xs:sequence>  元素按声明顺序出现
<xs:choice>    元素中选择一个出现
<xs:all>       所有元素出现,顺序任意

Occurrence 指示器

<xs:element name="item" type="xs:string"
            minOccurs="0" maxOccurs="10"/>
<xs:element name="tag" type="xs:string"
            minOccurs="1" maxOccurs="unbounded"/>

元素组(Group)

<xs:group name="personGroup">
  <xs:sequence>
    <xs:element name="name" type="xs:string"/>
    <xs:element name="age" type="xs:integer"/>
  </xs:sequence>
</xs:group>

<xs:element name="student">
  <xs:complexType>
    <xs:group ref="personGroup"/>
  </xs:complexType>
</xs:element>

属性组

<xs:attributeGroup name="commonAttrs">
  <xs:attribute name="id" type="xs:integer"/>
  <xs:attribute name="lang" type="xs:string"/>
</xs:attributeGroup>
...
<xs:attributeGroup ref="commonAttrs"/>

组的作用是复用:相同的结构定义一次,多处引用。

XML Schema any 元素

XML Schema any 元素

xs:any 允许在指定位置出现任意元素,实现 Schema 的扩展点。

基本用法

<xs:element name="container">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="known" type="xs:string"/>
      <xs:any minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

合法 XML

<container>
  <known>已知元素</known>
  <anything>任意扩展</anything>
  <another>再多都行</another>
</container>

限制命名空间

<xs:any namespace="http://example.com/ext"
         processContents="lax"/>

namespace: ##any(默认,任意) / ##other(非本命名空间) / 指定URI
processContents: strict(必须可校验) / lax(能校验则校验) / skip(不校验)

用途

  • 插件化架构:主 Schema 固定,允许第三方扩展
  • SOAP 协议:Envelope 中允许任意业务负载
  • 版本演进:旧版 Schema 兼容新元素

XML Schema anyAttribute 元素

XML Schema anyAttribute 元素

xs:anyAttribute 允许元素携带 Schema 未定义的任意属性,是属性的扩展点。

基本用法

<xs:element name="widget">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="title" type="xs:string"/>
    </xs:sequence>
    <xs:anyAttribute/>
  </xs:complexType>
</xs:element>

合法 XML

<widget id="w1" color="red" custom-attr="任意值">
  <title>组件</title>
</widget>

限制命名空间

<xs:anyAttribute namespace="##other"
                 processContents="lax"/>

用途

  • XML Namespace 声明(xmlns 属性)
  • xsi:schemaLocation 等实例属性
  • 第三方元数据附加
  • 框架级扩展属性

注意

anyAttribute 会显著放宽校验强度,除非确需扩展,否则不建议随意使用。

XML Schema 元素替换

XML Schema 元素替换

XSD 支持元素替换(Element Substitution),类似面向对象的多态,用可替换的组实现元素扩展。

substitutionGroup 替换

<xs:element name="vehicle" type="xs:string"/>

<xs:element name="car" type="xs:string"
            substitutionGroup="vehicle"/>
<xs:element name="truck" type="xs:string"
            substitutionGroup="vehicle"/>

替换的使用

<xs:element name="transport">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="vehicle"/>   <!-- 可被 car/truck 替换 -->
    </xs:sequence>
  </xs:complexType>
</xs:element>

合法 XML

<transport>
  <car>小汽车</car>
</transport>
<transport>
  <truck>卡车</truck>
</transport>

约束

  • 替换元素与被替换元素类型必须一致或是其派生
  • abstract 元素不能直接出现,只能被替换
  • block 属性可以禁止替换

抽象元素示例

<xs:element name="shape" type="xs:string" abstract="true"/>
<xs:element name="circle" type="xs:string" substitutionGroup="shape"/>
<xs:element name="square" type="xs:string" substitutionGroup="shape"/>

<!-- XML 中只能写 <circle> 或 <square>,不能直接写 <shape> -->

XML Schema 实例

XML Schema 实例

实例文档通过 XSI(XML Schema Instance)命名空间与 Schema 关联,并可用 xsi:type 覆盖类型。

实例命名空间

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

关联 Schema

<note xmlns="http://example.com/note"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://example.com/note note.xsd">

无命名空间文档

<note xsi:noNamespaceSchemaLocation="note.xsd">

xsi:type 指定类型

<!-- Schema 中 -->
<xs:element name="value" type="xs:string"/>

<!-- 实例中用 xsi:type 覆盖为整数 -->
<value xsi:type="xs:integer">42</value>

xsi:nil 空值

<!-- Schema: 允许空值 -->
<xs:element name="nickname" nillable="true" type="xs:string"/>

<!-- 实例: 显式空值 -->
<nickname xsi:nil="true"/>

完整实例示例

<?xml version="1.0"?>
<order xmlns="http://example.com/order"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://example.com/order order.xsd">
  <id>1001</id>
  <items>
    <item sku="A1" qty="2"/>
    <item sku="B2" qty="1" xsi:type="discountItem"/>
  </items>
</order>

XML Schema 字符串数据类型

XML Schema 字符串数据类型

字符串相关类型用于文本内容,支持多种约束。

基础字符串类型

xs:string         任意字符串
xs:normalizedString  空白规范化的字符串
xs:token          空白折叠的字符串(标记)
xs:language       语言代码(en, zh-CN)
xs:Name           XML 名称
xs:NCName         无冒号名称
xs:ID / xs:IDREF  标识符/引用
xs:NMTOKEN        名称标记

空白处理(whiteSpace)

<xs:restriction base="xs:string">
  <xs:whiteSpace value="preserve"/>   <!-- 保留 -->
  <xs:whiteSpace value="replace"/>    <!-- 空格替换为普通空格 -->
  <xs:whiteSpace value="collapse"/>   <!-- 折叠多个空格 -->
</xs:restriction>

字符串约束示例

<xs:simpleType name="username">
  <xs:restriction base="xs:string">
    <xs:minLength value="3"/>
    <xs:maxLength value="20"/>
    <xs:pattern value="[a-zA-Z0-9_]+"/>
  </xs:restriction>
</xs:simpleType>

token 类型特性

<xs:element name="tag" type="xs:token"/>
<!-- <tag>  hello  world  </tag> 自动规范为 "hello world" -->

ID 类型

<xs:attribute name="ref" type="xs:IDREF"/>
<!-- IDREF 必须指向文档中已存在的 ID -->

XML Schema 日期/时间数据类型

XML Schema 日期/时间数据类型

日期时间类型遵循 ISO 8601 标准,格式严格。

主要类型

xs:date         日期 2026-08-18
xs:time         时间 14:30:00
xs:dateTime     日期时间 2026-08-18T14:30:00
xs:duration     持续时间 P1Y2M3DT4H
xs:gYear        年份 2026
xs:gMonth       月份 --08
xs:gDay         日 ---18

date 格式

YYYY-MM-DD
<xs:element name="birthday" type="xs:date"/>
<birthday>1998-06-15</birthday>

dateTime 格式

YYYY-MM-DDTHH:MM:SS[时区]
<created>2026-08-18T14:30:00+08:00</created>
UTC 时区: 2026-08-18T06:30:00Z

时间限制

<xs:restriction base="xs:dateTime">
  <xs:minInclusive value="2020-01-01T00:00:00"/>
  <xs:maxInclusive value="2026-12-31T23:59:59"/>
</xs:restriction>

duration 格式

P 表示周期,Y年M月D日T时间H时M分S秒
P1Y      一年
P6M      六个月
P30D     三十天
PT8H     八小时
P1Y6M3D  一年六个月三天
<xs:element name="warranty" type="xs:duration"/>
<warranty>P2Y</warranty>

时区说明

Z 表示 UTC;+08:00 表示东八区;不带时区表示本地时间。

XML Schema 数值数据类型

XML Schema 数值数据类型

数值类型包括整数、小数、浮点等,支持范围和精度约束。

整数类型

xs:integer     任意整数
xs:nonNegativeInteger 非负整数
xs:positiveInteger    正整数
xs:nonPositiveInteger 非正整数
xs:negativeInteger    负整数
xs:long / int / short / byte   固定长度整数
xs:unsignedLong/Int/Short/Byte 无符号整数

小数与浮点

xs:decimal      任意精度小数
xs:float        单精度浮点(约7位有效数字)
xs:double       双精度浮点(约15位有效数字)

数值约束

<xs:simpleType name="discount">
  <xs:restriction base="xs:decimal">
    <xs:minInclusive value="0"/>
    <xs:maxInclusive value="1"/>
    <xs:fractionDigits value="2"/>     <!-- 最多2位小数 -->
  </xs:restriction>
</xs:simpleType>

位数控制

<xs:restriction base="xs:integer">
  <xs:totalDigits value="6"/>   <!-- 总位数最多6位 -->
  <xs:fractionDigits value="2"/> <!-- 小数位最多2位 -->
</xs:restriction>
<!-- 1234.56 合法; 12345.678 非法 -->

数值应用示例

<xs:element name="price" type="xs:decimal"/>
<xs:element name="stock" type="xs:positiveInteger"/>
<xs:element name="rate" type="xs:float"/>

注意

金额等精确计算建议用 decimal,避免 float/double 的精度误差。

XML Schema 杂项数据类型

XML Schema 杂项数据类型

除字符串、日期、数值外,XSD 还提供布尔、二进制等杂项类型。

布尔类型

xs:boolean  值: true / false / 1 / 0
<xs:element name="enabled" type="xs:boolean"/>
<enabled>true</enabled>

二进制类型

xs:base64Binary  Base64 编码的二进制
xs:hexBinary     十六进制编码的二进制

<xs:element name="logo" type="xs:base64Binary"/>
<logo>iVBORw0KGgoAAAANSUhEUg==</logo>

任意类型

xs:anyType        任意内容(文本/元素/属性)
xs:anySimpleType  任意简单类型

复合任意类型用法

<xs:element name="data" type="xs:anyType"/>
<data>可以是任意内容</data>

NOTATION 类型

xs:NOTATION  表示外部格式(如图片格式 jpg/gif/png)
需要配合 <xs:notation> 声明

QName 类型

xs:QName  限定名称(带命名空间前缀)
<xs:element name="ns" type="xs:QName"/>
<ns>xs:string</ns>

类型选择建议

  • 图片/文件内容:base64Binary
  • 开关状态:boolean
  • 完全开放:anyType

XML 编辑器

XML 编辑器

好用的 XML/XSD 工具能大幅提升编写与校验效率。

VS Code 方案

# 安装扩展
XML (by Red Hat)      XML 语法高亮、格式化、校验
XML Tools             格式化、XPath 工具
# 支持 XSD 校验:配置 settings.json
"xml.validation.schema": {
  "note.xml": "note.xsd"
}

独立工具

  • XMLSpy:专业 XML 工具,图形化 Schema 设计
  • Oxygen XML Editor:跨平台,功能全面
  • XML Notepad:微软轻量 XML 查看器
  • xmllint:命令行校验(自带)

命令行校验

# 校验 XML 是否格式良好
xmllint --noout note.xml

# 校验 XML 是否符合 XSD
xmllint --noout --schema note.xsd note.xml

Python 校验

from lxml import etree

xsd = etree.XMLSchema(etree.parse("note.xsd"))
doc = etree.parse("note.xml")
if xsd.validate(doc):
    print("校验通过")
else:
    print(xsd.error_log)   # 详细错误信息

Java 校验

SchemaFactory factory = SchemaFactory.newInstance(
    XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new File("note.xsd"));
Validator validator = schema.newValidator();
validator.validate(new StreamSource(new File("note.xml")));

XML Schema 总结

XML Schema 总结

恭喜你完成 XML Schema 教程!下面是核心知识回顾。

知识体系回顾

  • 基础概念:XSD 是 XML 结构约束标准,DTD 的现代替代
  • 简易元素:xs:element + type,只含文本
  • 属性:xs:attribute,use=required/optional
  • 限定 Facets:范围/长度/枚举/正则(pattern)
  • 复合元素:sequence/all/choice + 嵌套元素与属性
  • simpleContent:文本+属性混合
  • 指示器:顺序/出现次数/组复用
  • 扩展机制:any/anyAttribute/元素替换/命名类型
  • 数据类型:字符串/数值/日期/布尔/二进制
  • 实例关联:xsi:schemaLocation、xsi:type、xsi:nil

实战建议

  1. 先画数据结构图,再写 Schema
  2. 常用类型提取为命名类型(type)复用
  3. 用工具(xmllint/lxml)在 CI 中自动校验
  4. 适度约束:过严阻碍扩展,过松失去意义

应用场景回顾

Web 服务(WSDL/SOAP)、配置校验、数据交换、文档规范——XSD 是数据契约的通用语言。

后续学习

  • XSLT:XML 转换
  • XPath / XQuery:XML 查询
  • JSON Schema:JSON 世界里的对应标准

XML Schema 参考手册

XML Schema 参考手册

XSD 核心元素的快速参考表,方便日常查阅。

顶层元素

xs:schema            根元素
xs:element           元素定义
xs:attribute         属性定义
xs:simpleType        简单类型
xs:complexType       复合类型
xs:group             元素组
xs:attributeGroup    属性组
xs:notation          记号
xs:annotation        注释

复合类型内容

xs:sequence    顺序
xs:choice      选择
xs:all         任意顺序
xs:any         任意元素
xs:anyAttribute 任意属性
xs:simpleContent 文本+属性
xs:complexContent 类型派生

simpleType 限定

xs:restriction  限制基础类型
xs:list         列表类型(空格分隔)
xs:union        联合类型

常用 Facet

minInclusive/maxInclusive  范围含边界
minExclusive/maxExclusive  范围不含边界
minLength/maxLength        长度
length                     固定长度
enumeration                枚举
pattern                    正则
totalDigits/fractionDigits 数字位
whiteSpace                 空白处理

元素常用属性

name/ref/type/default/fixed
minOccurs/maxOccurs
nillable(允许xsi:nil)
abstract(抽象,须替换)
substitutionGroup(可替换组)
block(禁止替换/派生)

数据类型速查

string/integer/decimal/boolean
date/time/dateTime/duration
float/double/base64Binary
anyType/anySimpleType/QName

XSD 文档资源

  • W3C 规范:w3.org/XML/Schema
  • 参考教程:W3Schools XML Schema 教程
  • 校验工具:xmllint、XML Schema Validator(在线)
第 1 / 25 节