Schema,即XML Schema,XSD(XML Schema Definition)是W3C于2001年5月发布的推荐标准,指出如何形式描述XML文档的元素。XSD是许多XML Schema语言中的一支。XSD是首先分离于XML本身的schema语言,故获取W3C的推荐地位。

像所有XML Schema语言一样,XSD用来描述一组规则──一个XML文件必须遵守这些规则,才能根据该schema‘合法(Valid)’。

外文名

schema

对应关系

一个用户一般对应一个schema

释义

数据库对象的集合

全称

XML Schema

发布时间

2001年5月

发布组织

W3C

意义

如何形式描述XML文档的元素

简介

Schema,即XML Schema,XSD(XML Schema Definition)是W3C于2001年5月发布的推荐标准,指出如何形式描述XML文档的元素。XSD是许多XML Schema语言中的一支。XSD是首先分离于XML本身的schema语言,故获取W3C的推荐地位。

像所有XML Schema语言一样,XSD用来描述一组规则──一个XML文件必须遵守这些规则,才能根据该schema‘合法(Valid)’。

然而,与其他XML Schema语言不同,XSD意图设计为在确认一个文档的有效性时,将会产生满足特定数据类型的一个信息集合。这种后验证的XML信息集可用来开发XML文件处理软件。

名称来源

因为有其他XML schema语言存在,故在引用这W3C建议的语言时,使用XML Schema或W3C XML Schema,Schema永远前缀大写。

“XML Schema”在2001年5月成为W3C推荐标准。由于“XML Schema”作为一种W3C的推荐标准的名字与广义的XML Schema语言存在名称上的混淆,用户社区的一部分人采用了“WXS”来称呼它,用户社区的另一部分人采用“XSD”(XMLSchemaDefinition首字母缩略字)来称呼它。W3C发布的1.1标准采用了“XSD”作为官方称呼。

历史

在官方文档的参考附录里,XSD标准承认受到[文件类型描述|DTD]]和其他早期XML schema语言的影响,如DDML、SOX、XML-Data、以及XDR。XSD从中吸收了一些特性,然而也在这些特性中有所折衷。这些早期schema语言中的XDR与SOX在XML Schema发布后仍继续使用了一段时间。不少微软的产品支持XDR直到2006年十二月MSXML6.0的发布(MSXML6.0抛弃了XDR改用XSD)。Commerce One,Inc支持它自己的SOX schema语言直到该公司于2004年末破产。2004年十二月,Novell,Inc.购买了该公司,包括那些与SOX相关的专利,据报导是尽力防止被某些不相关的、以打专利相关官司为生的公司剥削图利。

著名的XSD建议的内容但在XML自己的DTD中不可用的特性是名字空间感知(namespace awareness)与数据类型。

2012年4月,XSD1.1成为W3C推荐标准。April 2012

Schema与其文档

技术上说schema是元数据的一个抽象集合,包含一套schema component:主要是元素与属性的声明、复杂与简单数据类型的定义。这些schema component通常是在处理一批schema document时被创建。schema文档包含着schema component的源语言定义。在日常使用中,一个schema文档常被称作一个schema。

Schema文档通过名字空间组织起来:所有的被命名的schema component属于一个目标名字空间;这个目标名字空间是schema文档作为整体的一个属性。schema文档可以包含进来(include)使用同一名字空间的其它schema文档,也可以导入(import)使用不同名字空间的schema文档。

当一个实例文档针对一个schema来验证有效性时(这一过程称为assessment),用来验证有效性的schema可以作为参数提供过验证器,也可以在实例文档中作为两种特殊属性之一直接提供:

xsi:schemaLocation

xsi:noNamespaceSchemaLocation.这种机制要求客户启动验证以充分相信这个文档,知道文档对正确的schema是有效的。

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

XML Schema Documents通常有文件扩展名".xsd".XSD还没有专门的互联网媒体类型,因此按照RFC3023使用"application/xml"或"text/xml".

Schema component

主要的schema component有:

  • 元素声明(Element declaration),定义了元素的性质。包括:元素名字、目标名字空间;一个非常重要的性质是元素的类型,它限制了元素包含哪些属性与子元素。在XSD1.1标准中,可以根据属性的值来有条件定义元素类型。一个元素可以属于一个替换群(substitution group),如果元素E在元素H的替换群中,那么schema许可H出现的地方E都可以出现。元素可以有完整性(integrity)约束:唯一性(uniqueness)约束确定特定值在该元素为根的子树中是独一无二的;引用(referential)约束确定值必须匹配一些其它元素的标识符。元素声明可以是全局的或局部的,允许同一个名字被用于一个实例文档的不同部分的不相关的元素。
  • 属性声明(Attribute declaration),定义了属性的性质。包括:属性名字、目标名字空间,属性类型限制了属性可以取哪些值,也可以指出属性的缺省值或固定值(fixed value,即属性只能取这个值)。
  • 简单与复杂数据类型(Simple and complex type).详见下节
  • 模型群(model group)与属性群(attribute group)定义。这实际上是宏(macro):被命名的元素的群与属性的群,可在许多数据类型定义中被重用。
  • 属性使用(attribute use)表示复杂数据类型与属性声明的关系,指出属性是必需的还是可选的,在什么时候使用这种数据类型。
  • 元素粒子(element particle)类似于表示复杂类型与元素的关系,指出元素在上下文中出现的最大与最小次数。类似于元素粒子,内容模型可以包括模型群粒子,在语法上相当于非终结符:定义了允许的元素序列的选择与重复的单位。此外,通配符粒子表示了一套元素或元素序列。

其它更专门的schema component包括annotations,assertions,notations,以及包含了schema整体信息的schema component.

数据类型

简单数据类型(simple type)包含了可以出现在元素或属性的文本值。这是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机制包括指出最大最小值、正则表达式、限制字符串的长度、限制十进制数的位数等。XSD1.1又增加了assertions,即通过一个[XPath2.0]]表达式给出任意约束的能力。

复杂数据类型描述了一个元素的许可内容。包括这个元素、属性、子元素的许可内容。复杂类型定义由一套属性使用与一个内容模型组成。内容模型可以是:

  • 只有元素的内容(element-only content),不允许有文本(但可以有空白符或者子元素可以有文本);
  • 简单内容(simple content), 许有文本,不允许有子元素;
  • 空内容(empty content),文本与子元素都不被允许;
  • 混合内容(mixed content),文本与子元素都可以有.

复杂数据类型可以从别的复杂类型导出:

  • restriction方法,不允许基类型允许的一些元素、属性或者值
  • extension方法,允许额外的属性或元素出现。

XSD1.1又增加了assertion方法来约束复杂类型,即通过一个[XPath2.0]]表达式必须求值为真

验证信息集

经过XML Schema为基的验证后,可以依照验证所隐含的数据模型来表达文档的结构与内容。XML Schema数据模型包括:

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

这些消息集成又叫后Schema验证信息集(Post-Schema-Validation Infoset(PSVI))。PSVI赋予合法XML文件它的"类型"并促进以对象般处理文件,如使用面向对象程序设计(OOP)变化型般操作。

这种对XML数据访问的特别的面向对象程序设计实现主要为微软──对XML Schema发展的主要贡献者──所倡导。转换一份XML文件到自行数据类型感知对象在某些软件设计部分相当有利。然而批评家争论这同时暗中破坏了开放性──XML的主要特征──并且它偏向于兼容原生于微软偏好的编程语言的资源类型。

另,从XML Schema数据类型继承出去的(以及肇因于XML Schema数据类型的)限制、这些数据类型与其他XML Schema间受限的搭配、以及在其他W3C规格里这些数据类型的相依性,是许多XML软件发展师的争论焦点。

XML Schema

XML Schema的主要用途是形式描述XML文档,然而最终的schema除了简单验证文档外还有许多其他用途。

代码生成

Schema可用于生成代码,这称作{[tsl|en|XML Data Binding}}。这些代码允许XML文档的内容作为编程环境中的对象。

XML文件结构文档的生成

Schema可用于产生人可读的文档来描述一个XML文件的结构。这在作者利用了标记元素(annotation element)时非常有用。

批评

虽然XML Schema获取了广泛的成功应用,但也受到了大量严厉的批评,远超出其他W3C推荐标准。下述研究者很好地总结了这些批评:James Clark,Anders Møller与Michael Schwartzbach,Rick Jelliffe,David Webber.

一般问题

  • 推荐标准数百页,语句非常技术化,对于非专业的用户来说过于复杂难读。很多人发现W3Cs XML Schema Primer更易于理解.
  • XSD缺少形式化数学规范,这使得关于schema的自动推理很困难,例如证明一个修改过的schema是向后兼容的。
  • 语言中有很多例外,如元素的限制(restriction)不同于属性的限制。

表达能力的实践限制

  • XSD对无序内容提供了极少支持
  • XSD不能要求提供root element(因而要求额外的信息来验证即使最简单的文档).
  • 在描述mixed content,没有任何方式约束字符内容(甚至没办法指定一个有效字符集).
  • 内容与属性声明不能依赖于元素或属性上下文(这也是DTD的一个大问题).
  • 不是100%自描述(上一点就是个例子),即使有这样的初始设计需求.
  • 默认不能被独立于声明被指定(这使其不能给出一族schema尽在默认值上不同);元素默认只能是字符数据(不包含markup).

技术问题

  • 虽然从技术上遵从名字空间,但看起来并不追随名字空间的精神原则。(例如"unqualified locals").
  • XSD1.0不提供机制,使得一个属性的值或者存在依赖于另一个属性的值或存在(被称为co-occurrence constraints).XSD1.1解决了这个问题.
  • XSD数据类型的范围非常随意.
  • 验证与扩增(augmentation,增加类型信息与默认值)应该保持分离。

参见

  • RELAX NG-另一种XML纲要语言(ISO国际标准)通常用在XML Schema数据类型上
  • XML信息集