Schema
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)
XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。
XML 文档可对 DTD 或 XML Schema 进行引用。
对 XML Schema 的引用
<note
xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
对 DTD 的引用
此文件包含对 DTD 的引用:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "http://www.w3school.com.cn/dtd/note.dtd">
<schema> 元素是每一个 XML Schema 的根元素。
<?xml version="1.0"?>
<xs:schema>
……
</xs:schema>
XML Schema 可定义 XML 文件的元素。
简易元素指那些只包含文本的元素。它不会包含任何其他的元素或属性。
定义简易元素的语法:
<xs:element name="xxx" type="yyy"/>
此处 xxx 指元素的名称,yyy 指元素的数据类型。XML Schema 拥有很多内建的数据类型。
最常用的类型是:
xs:string
xs:decimal
xs:integer
xs:boolean
xs:date
xs:time
简易元素的默认值和固定值
<xs:element name="color" type="xs:string" default="red"/>
<xs:element name="color" type="xs:string" fixed="red"/>
简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本身总是作为简易类型被声明的。
定义属性的语法是:
<xs:attribute name="xxx" type="yyy"/>
属性的默认值和固定值
<xs:attribute name="lang" type="xs:string" default="EN"/>
<xs:attribute name="lang" type="xs:string" fixed="EN"/>
可选的和必需的属性
在缺省的情况下,属性是可选的。如需规定属性为必选,请使用 "use" 属性:
<xs:attribute name="lang" type="xs:string" use="required"/>
限定(restriction)用于为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet。
对值的限定
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xs:simpleType>
对一组值的限定
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
对一系列值的限定
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/>
</xs:restriction>
</xs:simpleType>
对空白字符的限定
如需规定对空白字符(whitespace characters)的处理方式,我们需要使用 whiteSpace 限定。
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
</xs:restriction>
</xs:simpleType>
对长度的限定
如需限制元素中值的长度,我们需要使用 length、maxLength 以及 minLength 限定。
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
数据类型的限定
限定 |
描述 |
enumeration |
定义可接受值的一个列表 |
fractionDigits |
定义所允许的最大的小数位数。必须大于等于0。 |
length |
定义所允许的字符或者列表项目的精确数目。必须大于或等于0。 |
maxExclusive |
定义数值的上限。所允许的值必须小于此值。 |
maxInclusive |
定义数值的上限。所允许的值必须小于或等于此值。 |
maxLength |
定义所允许的字符或者列表项目的最大数目。必须大于或等于0。 |
minExclusive |
定义数值的下限。所允许的值必需大于此值。 |
minInclusive |
定义数值的下限。所允许的值必需大于或等于此值。 |
minLength |
定义所允许的字符或者列表项目的最小数目。必须大于或等于0。 |
pattern |
定义可接受的字符的精确序列。 |
totalDigits |
定义所允许的阿拉伯数字的精确位数。必须大于0。 |
whiteSpace |
定义空白字符(换行、回车、空格以及制表符)的处理方式。 |
复合元素包含了其他的元素及/或属性。
有四种类型的复合元素:
空元素
包含其他元素的元素
仅包含文本的元素
包含元素和文本的元素
两种方式来定义复合元素:
1、
<xs:element name="employee">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
"firstname" 以及 "lastname",被包围在指示器 <sequence>中。这意味着子元素必须以它们被声明的次序出现。
2、
"employee" 元素可以使用 type 属性,这个属性的作用是引用要使用的复合类型的名称:
<xs:element name="employee" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
已有的复合元素之上以某个复合元素为基础,然后添加一些元素,就像这样:
<xs:element name="employee" type="fullpersoninfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fullpersoninfo">
<xs:complexContent>
<xs:extension base="personinfo">
<xs:sequence>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
空的复合元素不能包含内容,只能含有属性。
“仅含元素”的复合类型元素是只能包含其他元素的元素。
复合类型仅包含元素
<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>
或者可以为 complexType 元素设定一个名称,并让 "person" 元素的 type 属性来引用此名称(如使用此方法,若干元素均可引用相同的复合类型):
<xs:element name="person" type="persontype"/>
<xs:complexType name="persontype">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
仅含文本的复合元素可包含文本和属性。
类型仅包含简易的内容(文本和属性),因此我们要向此内容添加 simpleContent 元素。当使用简易内容时,我们就必须在 simpleContent 元素内定义扩展或限定,就像这样:
<xs:element name="某个名称">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="basetype">
....
....
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
或者:
<xs:element name="某个名称">
<xs:complexType>
<xs:simpleContent>
<xs:restriction base="basetype">
....
....
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
</xs:element>
提示:请使用 extension 或 restriction 元素来扩展或限制元素的基本简易类型。
<shoesize country="france">35</shoesize>
下面这个例子声明了一个复合类型,其内容被定义为整数值,并且 "shoesize" 元素含有名为 "country" 的属性:
<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>
也可为 complexType 元素设定一个名称,并让 "shoesize" 元素的 type 属性来引用此名称(通过使用此方法,若干元素均可引用相同的复合类型):
<xs:element name="shoesize" type="shoetype"/>
<xs:complexType name="shoetype">
<xs:simpleContent>
<xs:extension base="xs:integer">
<xs:attribute name="country" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
混合的复合类型可包含属性、元素以及文本。
<xs:element name="letter">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="orderid" type="xs:positiveInteger"/>
<xs:element name="shipdate" type="xs:date"/>
</xs:sequence>
</xs:complexType>
</xs:element>
通过指示器,我们可以控制在文档中使用元素的方式。
指示器
有七种指示器:
Order 指示器:
All
Choice
Sequence
Occurrence 指示器:
maxOccurs
minOccurs
Group 指示器:
Group name
attributeGroup name
Order 指示器
Order 指示器用于定义元素的顺序。
<all> 指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次:
<choice> 指示器规定可出现某个子元素或者可出现另外一个子元素(非此即彼):
<sequence> 规定子元素必须按照特定的顺序出现
Occurrence 指示器用于定义某个元素出现的频率。
注释:对于所有的 "Order" 和 "Group" 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默认值均为 1。
<maxOccurs> 指示器可规定某个元素可出现的最大次数
<minOccurs> 指示器可规定某个元素能够出现的最小次数
Group 指示器用于定义相关的数批元素。
元素组通过 group 声明进行定义:
<xs:group name="组名称">
...
</xs:group>
属性组
属性组通过 attributeGroup 声明来进行定义:
<xs:attributeGroup name="组名称">
...
</xs:attributeGroup>
<any> 元素使我们有能力通过未被 schema 规定的元素来拓展 XML 文档
<anyAttribute> 元素使我们有能力通过未被 schema 规定的属性来扩展 XML 文档!
通过 XML Schema,一个元素可对另一个元素进行替换。
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
阻止元素替换
为防止其他的元素替换某个指定的元素,请使用 block 属性:
<xs:element name="name" type="xs:string" block="substitution"/>
使用 substitutionGroup
可替换元素的类型必须和主元素相同,或者从主元素衍生而来。假如可替换元素的类型与主元素的类型相同,那么您就不必规定可替换元素的类型了。
substitutionGroup 中的所有元素(主元素和可替换元素)必须被声明为全局元素,否则就无法工作!
全局元素指 "schema" 元素的直接子元素!本地元素(Local elements)指嵌套在其他元素中的元素。
字符串数据类型(String Data Type)
字符串数据类型可包含字符、换行、回车以及制表符。
规格化字符串数据类型源自于字符串数据类型。
规格化字符串数据类型同样可包含字符,但是 XML 处理器会移除折行,回车以及制表符。
ENTITIES |
|
ENTITY |
|
ID |
在 XML 中提交 ID 属性的字符串 (仅与 schema 属性一同使用) |
IDREF |
在 XML 中提交 IDREF 属性的字符串(仅与 schema 属性一同使用) |
IDREFS language |
包含合法的语言 id 的字符串 |
Name |
包含合法 XML 名称的字符串 |
NCName |
|
NMTOKEN |
在 XML 中提交 NMTOKEN 属性的字符串 (仅与 schema 属性一同使用) |
NMTOKENS |
|
normalizedString |
不包含换行符、回车或制表符的字符串 |
QName |
|
string |
字符串 |
token |
不包含换行符、回车或制表符、开头或结尾空格或者多个连续空格的字符串 |
对字符串数据类型的限定(Restriction)
可与字符串数据类型一同使用的限定:
enumeration
length
maxLength
minLength
pattern (NMTOKENS、IDREFS 以及 ENTITIES 无法使用此约束)
whiteSpace
日期及时间数据类型用于包含日期和时间的值。
日期数据类型(Date Data Type)
日期数据类型用于定义日期。
日期使用此格式进行定义:"YYYY-MM-DD",其中:
YYYY 表示年份
MM 表示月份
DD 表示天数
注释:所有的成分都是必需的!
如需规定一个时区,您也可以通过在日期后加一个 "Z" 的方式,使用世界调整时间(UTC time)来输入一个日期 - 比如这样:
<start>2002-09-24Z</start>
或者也可以通过在日期后添加一个正的或负时间的方法,来规定以世界调整时间为准的偏移量 - 比如这样:
<start>2002-09-24-06:00</start>
或者:
<start>2002-09-24+06:00</start>
时间数据类型(Time Data Type)
时间数据类型用于定义时间。
时间使用下面的格式来定义:"hh:mm:ss",其中
hh 表示小时
mm 表示分钟
ss 表示秒
时区
如需规定一个时区,您也可以通过在时间后加一个 "Z" 的方式,使用世界调整时间(UTC time)来输入一个时间 - 比如这样:
<start>09:30:10Z</start>
或者也可以通过在时间后添加一个正的或负时间的方法,来规定以世界调整时间为准的偏移量 - 比如这样:
<start>09:30:10-06:00</start>
或者:
<start>09:30:10+06:00</start>
日期时间数据类型(DateTime Data Type)
日期时间数据类型用于定义日期和时间。
日期时间使用下面的格式进行定义:"YYYY-MM-DDThh:mm:ss",其中:
YYYY 表示年份
MM 表示月份
DD 表示日
T 表示必需的时间部分的起始
hh 表示小时
mm 表示分钟
ss 表示秒
持续时间数据类型(Duration Data Type)
持续时间数据类型用于规定时间间隔。
时间间隔使用下面的格式来规定:"PnYnMnDTnHnMnS",其中:
P 表示周期(必需)
nY 表示年数
nM 表示月数
nD 表示天数
T 表示时间部分的起始 (如果您打算规定小时、分钟和秒,则此选项为必需)
nH 表示小时数
nM 表示分钟数
nS 表示秒数
负的持续时间
如需规定一个负的持续时间,请在 P 之前输入减号:
名称 |
描述 |
date |
定义一个日期值 |
dateTime |
定义一个日期和时间值 |
duration |
定义一个时间间隔 |
gDay |
定义日期的一个部分 - 天 (DD) |
gMonth |
定义日期的一个部分 - 月 (MM) |
gMonthDay |
定义日期的一个部分 - 月和天 (MM-DD) |
gYear |
定义日期的一个部分 - 年 (YYYY) |
gYearMonth |
定义日期的一个部分 - 年和月 (YYYY-MM) |
time |
定义一个时间值 |
对日期数据类型的限定(Restriction)
可与日期数据类型一同使用的限定:
enumeration
maxExclusive
maxInclusive
minExclusive
minInclusive
pattern
whiteSpace
十进制数据类型
十进制数据类型用于规定一个数值。
下面是一个关于某个 scheme 中十进制数声明的例子。
<xs:element name="prize" type="xs:decimal"/>
整数数据类型
整数数据类型用于规定无小数成分的数值。
下面是一个关于某个 scheme 中整数声明的例子。
<xs:element name="prize" type="xs:integer"/>
数值数据类型
请注意,下面所有的数据类型均源自于十进制数据类型(除 decimal 本身以外)!
名字 |
秒数 |
byte |
有正负的 8 位整数 |
decimal |
十进制数 |
int |
有正负的 32 位整数 |
integer |
整数值 |
long |
有正负的 64 位整数 |
negativeInteger |
仅包含负值的整数 ( .., -2, -1.) |
nonNegativeInteger |
仅包含非负值的整数 (0, 1, 2, ..) |
nonPositiveInteger |
仅包含非正值的整数 (.., -2, -1, 0) |
positiveInteger |
仅包含正值的整数 (1, 2, ..) |
short |
有正负的 16 位整数 |
unsignedLong |
无正负的 64 位整数 |
unsignedInt |
无正负的 32 位整数 |
unsignedShort |
无正负的 16 位整数 |
unsignedByte |
无正负的 8 位整数 |
对数值数据类型的限定(Restriction)
可与数值数据类型一同使用的限定:
enumeration
fractionDigits
maxExclusive
maxInclusive
minExclusive
minInclusive
pattern
totalDigits
whiteSpace
逻辑数据类型(Boolean Data Type)
逻辑数据性用于规定 true 或 false 值。
<xs:attribute name="disabled" type="xs:boolean"/>
二进制数据类型(Binary Data Types)
二进制数据类型用于表达二进制形式的数据。
我们可使用两种二进制数据类型:
base64Binary (Base64 编码的二进制数据)
hexBinary (十六进制编码的二进制数据)
下面是一个关于某个 scheme 中 hexBinary 声明的例子:
<xs:element name="blobsrc" type="xs:hexBinary"/>
AnyURI 数据类型(AnyURI Data Type)
anyURI 数据类型用于规定 URI。
下面是一个关于某个 scheme 中 anyURI 声明的例子:
<xs:attribute name="src" type="xs:anyURI"/>
杂项数据类型(Miscellaneous Data Types)
名称 |
描述 |
anyURI |
|
base64Binary |
|
boolean |
|
double |
|
float |
|
hexBinary |
|
NOTATION |
|
QName |
|
对杂项数据类型的限定(Restriction)
可与杂项数据类型一同使用的限定:
enumeration (布尔数据类型无法使用此约束*)
length (布尔数据类型无法使用此约束)
maxLength (布尔数据类型无法使用此约束)
minLength (布尔数据类型无法使用此约束)
pattern
whiteSpace
约束指 constraint。
XSD 元素
元素 |
解释 |
all |
规定子元素能够以任意顺序出现,每个子元素可出现零次或一次。 |
annotation 元素是一个顶层元素,规定 schema 的注释。 |
|
使创作者可以通过未被 schema 规定的元素来扩展 XML 文档。 |
|
使创作者可以通过未被 schema 规定的属性来扩展 XML 文档。 |
|
规定 annotation 元素中应用程序要使用的信息。 |
|
定义一个属性。 |
|
定义在复杂类型定义中使用的属性组。 |
|
仅允许在 <choice> 声明中包含一个元素出现在包含元素中。 |
|
定义对复杂类型(包含混合内容或仅包含元素)的扩展或限制。 |
|
定义复杂类型。 |
|
定义 schema 中的文本注释。 |
|
定义元素。 |
|
扩展已有的 simpleType 或 complexType 元素。 |
|
规定 XPath 表达式,该表达式规定用于定义标识约束的值。 |
|
定义在复杂类型定义中使用的元素组。 |
|
向一个文档添加带有不同目标命名空间的多个 schema。 |
|
向一个文档添加带有相同目标命名空间的多个 schema。 |
|
指定属性或元素值(或一组值)必须是指定范围内的键。 |
|
规定属性或元素值(或一组值)对应指定的 key 或 unique 元素的值。 |
|
把简单类型定义为指定数据类型的值的一个列表。 |
|
描述 XML 文档中非 XML 数据的格式。 |
|
重新定义从外部架构文件中获取的简单和复杂类型、组和属性组。 |
|
定义对 simpleType、simpleContent 或 complexContent 的约束。 |
|
定义 schema 的根元素。 |
|
指定 XPath 表达式,该表达式为标识约束选择一组元素。 |
|
要求子元素必须按顺序出现。每个子元素可出现 0 到任意次数。 |
|
包含对 complexType 元素的扩展或限制且不包含任何元素。 |
|
定义一个简单类型,规定约束以及关于属性或仅含文本的元素的值的信息。 |
|
定义多个 simpleType 定义的集合。 |
|
指定属性或元素值(或者属性或元素值的组合)在指定范围内必须是唯一的。 |
XSD Restrictions/Facets for Datatypes
限定 |
描述 |
enumeration |
定义可接受值的一个列表 |
fractionDigits |
定义所允许的最大的小数位数。必须大于等于0。 |
length |
定义所允许的字符或者列表项目的精确数目。必须大于或等于0。 |
maxExclusive |
定义数值的上限。所允许的值必须小于此值。 |
maxInclusive |
定义数值的上限。所允许的值必须小于或等于此值。 |
maxLength |
定义所允许的字符或者列表项目的最大数目。必须大于或等于0。 |
minExclusive |
定义数值的下限。所允许的值必需大于此值。 |
minInclusive |
定义数值的下限。所允许的值必需大于或等于此值。 |
minLength |
定义所允许的字符或者列表项目的最小数目。必须大于或等于0。 |
pattern |
定义可接受的字符的精确序列。 |
totalDigits |
定义所允许的阿拉伯数字的精确位数。必须大于0。 |
whiteSpace |
定义空白字符(换行、回车、空格以及制表符)的处理方式。 |