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
| 特性 | DTD | XML Schema |
|---|---|---|
| 语法 | 非 XML | XML |
| 数据类型 | 有限(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 的诸多局限,是数据交换场景的标准选择。
主要理由
- 数据类型丰富:内置 44+ 种数据类型,支持自定义
- 数据校验强:长度、范围、模式、枚举等约束
- 命名空间:支持模块化、避免命名冲突
- 面向对象:类型可继承(extension/restriction)
- 可读可编程: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
实战建议
- 先画数据结构图,再写 Schema
- 常用类型提取为命名类型(type)复用
- 用工具(xmllint/lxml)在 CI 中自动校验
- 适度约束:过严阻碍扩展,过松失去意义
应用场景回顾
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(在线)