GEOZ

XML Schema(XSD)核心组件与元素声明详解

2026/8/5
XML Schema(XSD)核心组件与元素声明详解

AIAI Summary (BLUF)

XML Schema(XSD)是W3C制定的标准,用于定义XML文档的结构和数据类型。文章介绍了XSD的起源、与DTD的对比、历史发展以及核心组件,包括元素声明、属性声明和类型定义。它帮助开发者验证XML文档的合法性,确保数据交换的一致性。

核心洞察

说个有意思的事:XSD 从 2001 年发布到现在,被骂了二十多年,却依然是 XML 世界里最主流的 schema 语言。它的规范几百页,表达力却有明显短板,这些争议到今天也没真正解决。读它就像读一门编程语言的设计史,能看出 W3C 当年在野心和实用性之间的摇摆。

核心结论

  1. XML Schema(XSD)是 W3C 于 2001 年 5 月发布的推荐标准,2012 年 4 月又发布 XSD 1.1;它虽长期受批评,但仍是 XML 世界中最主流的 schema 语言。

  2. XSD 内置 19 个基本数据类型(如 string、date、decimal、QName 等),并通过 restriction、list、union 三种机制派生出 25 个标准导出类型;复杂类型则支持仅元素、简单内容、空内容、混合内容四种内容模型。

  3. XSD 1.1 新增了 assertions,用 XPath 2.0 表达式实现任意约束,解决了 XSD 1.0 无法表达“一个属性的值或存在与否依赖另一个属性”这类 co-occurrence constraints 的问题。

  4. XSD 文档通常以 .xsd 为后缀,但至今没有专属互联网媒体类型,按 RFC 3023 一般使用 application/xml 或 text/xml。

  5. XSD 的常见批评包括:无法强制指定 root element、对无序内容支持很弱、规范缺乏形式化数学定义,导致自动推理和向后兼容性验证困难。

简介

XML Schema 是 W3C 在 2001 年 5 月发布的推荐标准,用来形式化描述 XML 文档的结构。它的缩写是 XSD,全称 XML Schema Definition。在众多 XML Schema 语言里,XSD 是最早从 XML 本身分离出来独立发展的一个,所以拿到了 W3C 推荐地位。

和所有 XML Schema 语言一样,XSD 给 XML 文件定了一组规则。文件想通过验证、成为"合法"文档,就必须遵守这些规则。

XSD 有个特别之处:它在验证文档时,会生成一个带有特定数据类型的信息集合。这个后验证信息集可以用来开发处理 XML 文件的软件。

XSD 名称的来源

因为还有别的 XML schema 语言,指代 W3C 推荐的这个标准时,一般用全称 XML Schema 或 W3C XML Schema,Schema 首字母大写。

"XML Schema" 在 2001 年 5 月成为 W3C 推荐标准。但这名字和广义的 XML Schema 语言撞了,容易混淆。社区一部分人叫它 WXS,另一部分人叫它 XSD,也就是 XML Schema Definition 首字母的缩略。后来 W3C 发布 1.1 版本,官方正式采用 XSD 这个名称。

历史

官方文档的参考附录承认,XSD 受到 DTD 和其他早期 schema 语言的影响,比如 DDML、SOX、XML-Data、XDR。XSD 吸收了其中一些特性,也在某些地方做了折衷。XDR 和 SOX 在 XML Schema 发布后还继续活了一段时间。微软的产品一直支持 XDR,直到 2006 年 12 月 MSXML 6.0 发布才弃用,改用 XSD。Commerce One 一直用自家的 SOX,直到 2004 年底公司破产。那年 12 月,Novell 收购了它,把 SOX 相关专利也一并带走,据说是为了防止被专利流氓拿来牟利。

XML 的 DTD 没有而 XSD 有的两个特性:名字空间感知和数据类型。

2012 年 4 月,XSD 1.1 成为 W3C 推荐标准。

Schema 与 schema 文档

技术上讲,schema 是元数据的一个抽象集合,里面是一套 schema component元素声明属性声明、复杂类型和简单类型的定义。这些 component 通常在处理 schema 文档时创建出来。schema 文档保存的是 component 的源语言定义。日常使用中,一个 schema 文档经常直接被叫做 schema。

schema 文档靠名字空间组织。所有被命名的 schema component 都属于一个目标名字空间,这是 schema 文档作为一个整体的属性。schema 文档可以 include 同名字空间的其他文档,也可以 import 不同名字空间的文档。

验证实例文档时,schema 可以当参数传给验证器,也可以写在文档里,通过两个特殊属性指定:xsi:schemaLocation 和 xsi:noNamespaceSchemaLocation。后一种方式要求客户端主动做验证,并且相信文档确实是照着正确的 schema 写的。

"xsi" 是名字空间 http://www.w3.org/2001/XMLSchema-instance 的传统前缀。

XML Schema 文档通常以 .xsd 结尾。XSD 到现在都没有专属的互联网媒体类型,按 RFC 3023 一般用 application/xml 或 text/xml。

Schema 组件

主要的 schema component 有这么几类:

  • 元素声明:定义元素的性质。包括元素名字、目标名字空间,最重要的还是元素类型,它限制了元素能带哪些属性、能装哪些子元素。XSD 1.1 里,可以根据属性的值来有条件地定义元素类型。元素还能加入替换群(substitution group),元素 E 如果在元素 H 的替换群里,那 H 能出现的地方 E 都能顶上去。元素还能带完整性约束:唯一性约束保证某个值在子树里只有一个,引用约束要求值必须匹配其他元素的标识符。元素声明分全局和局部两种,这样同一个名字可以用于文档不同位置的不同元素。
  • 属性声明:定义属性的性质。包括属性名字、目标名字空间、类型,类型决定属性可以取哪些值,还可以指定缺省值或者固定值。
  • 简单和复杂数据类型:这个下面单独说。
  • 模型群(model group)和属性群(attribute group):这俩相当于宏,把一群元素或一群属性打包命名,供多个数据类型定义复用。
  • 属性使用(attribute use):表示复杂数据类型和属性声明之间的关系,说明属性是必选还是可选,什么时候用这种数据类型。
  • 元素粒子(element particle):作用类似,复杂类型通过它声明子元素,指出元素在上下文里最多最少出现几次。内容模型里还可以有模型群粒子,语法上相当于非终结符,它定义了元素序列的选择和重复单位。通配符粒子则表示一组元素或元素序列。

其他更专门的 component 还有 annotations、assertions、notations,以及存放 schema 整体信息的 schema component。

数据类型

简单数据类型描述元素或属性能出现的文本值。这是 XSD 和 DTD 最大的差别。

XSD 内置了 19 个基本数据类型:anyURI、base64Binary、boolean、date、dateTime、decimal、double、duration、float、hexBinary、gDay、gMonth、gMonthDay、gYear、gYearMonth、NOTATION、QName、string、time。

基本类型可以用三种机制派生出新类型:

  • restriction:缩小值集范围
  • list:允许一个值的序列
  • union:允许从几个数据类型中选值

XSD 规范定义了 25 个导出类型。用户也可以在自己的 schema 里继续定义类型。

restriction 可以限制最大值最小值、用正则表达式约束格式、限制字符串长度、限制小数位数等等。XSD 1.1 增加了 assertions,用 XPath 2.0 表达式做任意约束。

复杂数据类型描述元素的许可内容,包括属性和子元素。一个复杂类型定义由属性使用和内容模型组成。内容模型分四种:

  • 仅元素内容:不允许文本,空白字符除外,子元素自己可以有文本
  • 简单内容:允许文本,不允许子元素
  • 空内容:文本和子元素都不行
  • 混合内容:文本和子元素都可以

复杂类型还能从其他复杂类型派生:

  • restriction:去掉基类型允许的部分元素、属性或值
  • extension:增加额外的属性或元素

XSD 1.1 又加了 assertion,用 XPath 2.0 表达式必须求值为真来约束复杂类型。

后 Schema 验证信息集

XML Schema 验证完成之后,文档的结构和内容可以按验证隐含的数据模型来理解。这个数据模型包含:

  • 字汇:元素与属性名称的集合
  • 内容模型:关系与结构
  • 数据类型

这套信息集叫做后 Schema 验证信息集(Post-Schema-Validation Infoset,简称 PSVI)。PSVI 给合法的 XML 文件赋予了"类型",让它可以像对象一样被处理,比如用面向对象的路子来操作。

这种把 XML 当对象处理的方式,主要是微软在推。微软是 XML Schema 发展的主要贡献者。把 XML 文件转成带类型感知的对象,某些软件设计场景下确实好用。不过批评者觉得,这动了 XML 的根本,也就是开放性。而且这么做偏向兼容微软自己编程语言偏好的资源类型。

另外,XML Schema 数据类型的继承限制、和其他数据类型搭配时的各种限制,以及其他 W3C 规范对它的依赖,一直是不少 XML 开发者争论的焦点。

XML Schema 的次要用途

XML Schema 主要用来形式化描述 XML 文档,但除了验证,schema 还能干点别的。

代码生成

schema 可以用来生成代码,这叫 XML Data Binding。生成的代码把 XML 文档的内容映射成编程环境里的对象。

XML 文件结构文档的生成

schema 也能用来生成人可读的文档,描述 XML 文件的结构。如果作者在 schema 里用了 annotation 元素,这个功能会特别好用。

批评

XML Schema 应用很广,但挨的骂也远超其他 W3C 推荐标准。James Clark、Anders Møller、Michael Schwartzbach、Rick Jelliffe、David Webber 这些研究者都对它做过系统的批评。

一般问题

  • 规范文本几百页,全是技术黑话,非专业用户根本读不进去。很多人觉得 W3C 的 XML Schema Primer 友好多了。
  • XSD 没有形式化的数学规范,想对 schema 做自动推理很困难。比如想证明一个修改后的 schema 是否向后兼容,就很难下手。
  • 语言里全是例外。比如对元素的 restriction 和对属性的 restriction,规则并不一样。

表达能力的实践限制

  • 对无序内容支持很弱。
  • 不能强制要求 root element。所以哪怕是最简单的文档,也得靠额外信息才能完成验证。
  • 描述混合内容时,没有任何办法约束字符内容,连指定有效字符集都做不到。
  • 内容和属性声明不能依赖元素或属性的上下文。这也是 DTD 的老毛病了。
  • 不是百分百自描述。虽然设计初期有这样的目标。
  • 默认值不能独立于声明指定。所以没法让一族 schema 只在默认值上有差异。元素默认值还只能是纯字符数据,不能带标记。

技术问题

  • 虽然技术上遵从名字空间,但感觉没有遵守名字空间的精神。比如 "unqualified locals" 就是个例子。
  • XSD 1.0 没有任何机制能让一个属性的值或存在与否依赖另一个属性,这类问题叫 co-occurrence constraints。XSD 1.1 解决了。
  • 数据类型范围的划分很随意。
  • 验证和扩增(augmentation,增加类型信息和默认值)应该分开,XSD 却把两件事搅在了一起。

参见

RELAX NG:另一种 XML schema 语言,ISO 国际标准,通常会搭配 XML Schema 数据类型使用。

常见问题(FAQ)

XML Schema(XSD)是什么?和DTD有什么不同?

XML Schema是W3C制定的标准,用于描述XML文档结构和数据类型。相比DTD,它支持命名空间和数据类型,能更精确地验证文档合法性。

XSD有哪些主要组件?

XSD组件包括元素声明、属性声明、简单和复杂类型、模型组、属性组等。这些组件共同定义XML文档的结构和约束。

什么是后Schema验证信息集(PSVI)?

PSVI是XML文档通过Schema验证后生成的信息集合,包含元素类型、关系等,使XML可被当作类型化对象处理。微软对此贡献较大。

Roger深圳
本文由 Roger 审核,最后更新于 2026年8月8日
联系编辑 →
← 返回文章列表
分享到:微博

版权与免责声明:本文仅用于信息分享与交流,不构成任何形式的法律、投资、医疗或其他专业建议,也不构成对任何结果的承诺或保证。

文中提及的商标、品牌、Logo、产品名称及相关图片/素材,其权利归各自合法权利人所有。本站内容可能基于公开资料整理,亦可能使用 AI 辅助生成或润色;我们尽力确保准确与合规,但不保证完整性、时效性与适用性,请读者自行甄别并以官方信息为准。

若本文内容或素材涉嫌侵权、隐私不当或存在错误,请相关权利人/当事人联系本站,我们将及时核实并采取删除、修正或下架等处理措施。也请勿在评论或联系信息中提交身份证号、手机号、住址等个人敏感信息。