XML Schema(XSD)是W3C制定的XML结构描述标
AIAI Summary (BLUF)
XML Schema(XSD)是W3C制定的XML结构描述标准,支持数据类型和命名空间,自2001年起就是XML生态中最主流的schema语言。文章介绍了它的历史、核心组件、简单与复杂类型,以及XSD 1.1的断言机制,也梳理了它在无序内容支持、根元素强制等方面的常见批评。
核心洞察
这篇文章最有意思的点是:一个被骂了二十多年的标准,居然还是 XML 世界的主流。XSD 的问题大家其实心知肚明,但生态和工具链早就绑死了,没人真去换。至于 1.1 用 assertions 补表达力的短板,我持保留态度,XPath 2.0 的门槛不低,能写出来和能维护是两码事。
核心结论
- XML Schema(XSD)是 W3C万维网联盟,制定Web标准的国际组织,发布了XML Schema标准。 在 2001 年 5 月发布的推荐标准,2012 年 4 月发布 1.1 版本;尽管被批评多年,它仍是 XML 世界使用最广的 schema 语言。
- XSD 内置 19 个基本数据类型,并通过 restriction、list、union 三种机制派生出 25 个标准类型;复杂类型定义包含子元素和/或属性的元素的数据类型。支持四种内容模型:仅元素、简单内容、空内容、混合内容。
- XSD 1.1 新增 assertions,用 XPath 2.0 表达式实现任意约束,解决了 XSD 1.0 无法表达 co-occurrence constraints 的问题,即一个属性的值或存在性无法依赖另一个属性。
- XSD 文档通常以 .xsd 为后缀,但至今没有专属的互联网媒体类型,按 RFC 3023 一般使用 application/xml 或 text/xml。
- 对 XSD 的长期批评集中在几个具体缺陷:无法强制指定根元素、对无序内容支持很弱、缺少形式化数学定义,导致自动推理和向后兼容验证很难进行。
核心结论
- XML Schema(XSD)是 W3C 在 2001 年 5 月发布的推荐标准,2012 年 4 月出了 1.1 版本。被骂了二十多年,在 XML 世界里它依然是使用最广的 schema 语言。
- XSD 自带 19 个基本数据类型,像 string、date、decimal、QName 这些。通过 restriction、list、union 三种机制,又派生出 25 个标准类型。复杂类型支持四种内容模型:仅元素、简单内容、空内容、混合内容。
- XSD 1.1 加入了 assertions,用 XPath 2.0 表达式做任意约束。这解决了 XSD 1.0 的一个老大难问题:一个属性的值或存在与否没法依赖另一个属性,也就是 co-occurrence constraints。
- XSD 文档后缀通常是 .xsd,但到现在也没有专属的互联网媒体类型,按 RFC 3023 一般用 application/xml 或 text/xml。
- 对 XSD 的批评常年集中在这几点:没法强制指定根元素、对无序内容支持很弱、规范缺少形式化数学定义,自动推理和向后兼容验证都很难做。
简介
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 首字母大写。
2001 年 5 月它成为 W3C 推荐标准。但"XML Schema"这个说法和广义的 schema 语言撞了名,容易搞混。社区里叫法不统一,有人叫 WXS,有人叫 XSD,XSD 是 XML Schema Definition 的缩写。后来 W3C 发布 1.1 版本,官方正式采用 XSD 这个名字。
历史
官方参考附录承认,XSD 受 DTD文档类型定义,XML的旧式结构描述语言,XSD的替代品。 和其他早期 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 相关专利,据说是为了防止专利流氓拿去牟利。
XSD 有两个 DTD 没有的特性:名字空间感知和数据类型。
2012 年 4 月,XSD 1.1 成为 W3C 推荐标准。
Schema 与 schema 文档
技术上的说法是,schema 是元数据的一个抽象集合,里面装着一套 schema component:元素声明定义XML元素名称、类型和约束的声明。、属性声明定义XML属性名称、类型和约束的声明。、复杂类型定义、简单类型定义无子元素的元素或属性的数据类型。定义。这些 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 的规则居然不一样。
表达能力的实践限制
- 对无序内容支持很弱。
- 不能强制指定根元素。哪怕是最简单的文档,也得靠额外信息才能完成验证。
- 描述混合内容时,完全没办法约束字符内容,连指定有效字符集都做不到。
- 内容和属性声明不能依赖元素或属性的上下文。这毛病 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 有哪些主要组件?
主要组件包括元素声明、属性声明、简单类型、复杂类型、模型组、属性组等。这些组件合起来定义 XML 文档的结构和约束。
什么是后 Schema 验证信息集(PSVI)?
PSVI 是 XML 文档通过 Schema 验证后生成的信息集合,包含元素类型、关系等,XML 由此可被当作类型化对象来处理。这个方向微软是主要推手。
常见问题(FAQ)
XML Schema(XSD)是什么?
XML Schema(XSD)是W3C于2001年发布的XML结构描述标准,支持数据类型和命名空间用于唯一标识XML元素和属性的URI集合,避免名称冲突。,是XML生态中最主流的schema语言。它用XSD文档定义元素、属性和类型,验证XML文档结构。
XSD 1.1 有哪些新特性?
XSD 1.1 最主要的新特性是断言(assertions),使用XPath 2.0表达式实现任意约束,解决了属性值依赖其他属性(co-occurrence constraints)的问题。此外,还支持基于属性值有条件地定义元素类型。
XML Schema有哪些常见缺点?
XSD的常见批评包括:无法强制指定根元素、对无序内容支持较弱、缺少形式化数学定义,导致自动推理和向后兼容验证困难。此外,XSD文档没有专属媒体类型,通常用application/xml或text/xml。
版权与免责声明:本文仅用于信息分享与交流,不构成任何形式的法律、投资、医疗或其他专业建议,也不构成对任何结果的承诺或保证。
文中提及的商标、品牌、Logo、产品名称及相关图片/素材,其权利归各自合法权利人所有。本站内容可能基于公开资料整理,亦可能使用 AI 辅助生成或润色;我们尽力确保准确与合规,但不保证完整性、时效性与适用性,请读者自行甄别并以官方信息为准。
若本文内容或素材涉嫌侵权、隐私不当或存在错误,请相关权利人/当事人联系本站,我们将及时核实并采取删除、修正或下架等处理措施。也请勿在评论或联系信息中提交身份证号、手机号、住址等个人敏感信息。



