xml schema - QLGQ/learning-python GitHub Wiki
- XML Schema是基于XML的DTD的替代者。
- XML Schema描述XML文档的结构。
- XML Schema语言也称作XML Schema定义(XML Schema Definition,XSD)。
XML Schema的作用是定义XML文档的合法构建模块,类似DTD。
- 定义可出现在文档中的元素
- 定义可出现在文档中的属性
- 定义哪个元素是子元素
- 定义子元素的次序
- 定义子元素的数目
- 定义元素是否为空,或者是否可包含文本
- 定义元素和属性的数据类型
- 定义元素和属性的默认值以及固定值
XML Schema最重要的能力之一就是对数据类型的支持。
通过对数据类型的支持:
- 可更容易地描述允许的文档内容
- 可更容易地验证数据的正确性
- 可更容易地与来自数据库的数据一并工作
- 可更容易地定义数据约束(data facets)
- 可更容易地定义数据类型(或称数据格式)
- 可更容易地在不同的数据类型间转换数据
数据约束,或称 facets,是 XML Schema 原型中的一个术语,中文可译为“面”,用来约束数据类型的容许值。
简易元素指那些只包含文本的元素。它不会包含任何其他的元素或属性。
不过,“仅包含文本”这个限定却很容易造成误解。文本有很多类型。它可以是 XML Schema 定义中包括的类型中的一种(布尔、字符串、数据等等),或者它也可以是您自行定义的定制类型。
您也可向数据类型添加限定(即 facets),以此来限制它的内容,或者您可以要求数据匹配某种特定的模式。
定义简易元素的语法:
<xs:element name="xxx" type="yyy"/>
此处 xxx 指元素的名称,yyy 指元素的数据类型。XML Schema 拥有很多内建的数据类型。
最常用的类型:
- xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
简易元素可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。固定值同样会自动分配给元素,并且您无法规定另外一个值。
所有的属性均作为简易类型来声明。
简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本身总是作为简易类型被声明的。
定义属性的语法:
<xs:attribute name="xxx" type="yyy"/>
在此处,xxx 指属性名称,yyy 则规定属性的数据类型。XML Schema 拥有很多内建的数据类型。
最常用的类型:
- xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
Instance:
这是带有属性的XML元素:
<lastname lang="EN">Smith</lastname>
这是对应的属性定义:
<xs:attribute name="lang" type="xs:string"/>
属性可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。固定值同样会自动分配给元素,并且您无法规定另外的值。
在缺省的情况下,属性是可选的。如需规定属性为必选,请使用 "use" 属性:
<xs:attribute name="lang" type="xs:string" use="required"/>
当 XML 元素或属性拥有被定义的数据类型时,就会向元素或属性的内容添加限定。
假如 XML 元素的类型是 "xs:date",而其包含的内容是类似 "Hello World" 的字符串,元素将不会(通过)验证。
通过 XML schema,您也可向您的 XML 元素及属性添加自己的限定。这些限定被称为 facet(编者注:意为(多面体的)面,可译为限定面)。
限定(restriction)用于为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet。
- 对值的限定
- 对一组值的限定
- 对一系列值的限定
- 对一系列值的其他限定
- 对空白字符的限定
- 对长度的限定
限定 | 描述 |
---|---|
enumeration | 定义可接受*值的一个列表 |
fractionDigits | 定义所允许的最大的小数位数,必须大于等于0 |
length | 定义所允许的字符或者列表项目的精确数目,必须大于或者等于0 |
maxExclusive | 定义数值的上限,所允许的值必须小于此值 |
maxInclusive | 定义数值的上*限,所允许的值必须小于或等于此值 |
maxLength | 定义所允许的字符或者列表项目的最大数目,必须大于或等于0 |
minExclusive | 定义数值的下限,所允许的值必须大于此值 |
minInclusive | 定义数值的下限,所允许的值必须大于或等于此值 |
minLength | 定义所允许的字符或者列表项目的最小数目,必须大于或等于0 |
pattern | 定义可接受的字符的精确序列 |
totalDigits | 定义所允许的阿拉伯数字的精确位数,必须大于0 |
whiteSpace | 定义空白字符(换行、回车、空格以及制表符)的处理方式 |
Instance:
<xs:element name="car">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
上面的例子也可以被写为:
<xs:element name="car" type="carType"/>
<xs:simpleType name="carType">
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
**注释:**在这种情况下,类型 "carType" 可被其他元素使用,因为它不是 "car" 元素的组成部分。
复合元素包含了其他的元素及/或属性。
四中类型的复合元素:
- 空元素
- 包含其他元素的元素
- 仅包含文本的元素
- 包含元素和文本的元素
**注释:**上述元素均可包含属性!
Instances:
复合元素,“product”,是空的:
<product pid="1345"/>
复合元素,“employee”,仅包含其他元素:
<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>
复合元素,“food”,仅包含文本:
<food type="dessert">Ice cream</food>
复合元素,"description",包含元素和文本:
<description>
It happened on <date lang="norwegian">03.03.99</date> ....
</description>
- 通过命名此元素,可直接对"employee"元素进行声明,就像这样:
<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>
假如使用上面所描述的方法,那么仅有 "employee" 可使用所规定的复合类型。请注意其子元素,"firstname" 以及 "lastname",被包围在指示器 中。这意味着子元素必须以它们被声明的次序出现。
- "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="personinfo"/>
<xs:element name="student" type="personinfo"/>
<xs:element name="member" 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>
仅含文本的复合元素
此类型仅包含简易的内容(文本和属性)
混合的复合类型可包含属性、元素、以及文本。
XM元素,"letter",含有文本以及其他元素:
<letter>
Dear Mr.<name>John Smith</name>.
Your order <orderid>1032</orderid>
will be shipped on <shipdate>2001-07-13</shipdate>.
</letter>
下面这个 schema 声明了这个 "letter" 元素:
<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>
**注释:**为了使字符数据可以出现在 "letter" 的子元素之间,mixed 属性必须被设置为 "true"。xs:sequence 标签 (name、orderid 以及 shipdate ) 意味着被定义的元素必须依次出现在 "letter" 元素内部。
我们也可以为 complexType 元素起一个名字,并让 "letter" 元素的 type 属性引用 complexType 的这个名称(通过这个方法,若干元素均可引用同一个复合类型):
<xs:element name="letter" type="lettertype"/>
<xs:complexType name="lettertype" 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>
通过指示器,我们可以控制在文档中使用元素的方式。
有七种指示器:
1. Order指示器: (Order指示器用于定义元素的顺序。)
- All(<all> 指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次)(当使用 <all> 指示器时,你可以把 <minOccurs> 设置为 0 或者 1,而只能把 <maxOccurs> 指示器设置为 1)
- Choice(<choice> 指示器规定可出现某个子元素或者可出现另外一个子元素(非此即彼)(如需设置子元素出现任意次数,可将 <maxOccurs> 设置为 unbounded(无限次)。)
- Sequence(<sequence> 规定子元素必须按照特定的顺序出现)
2. Occurence指示器:(Occurrence 指示器用于定义某个元素出现的频率。)(对于所有的 "Order" 和 "Group" 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默认值均为 1。)
- maxOccurs(<maxOccurs> 指示器可规定某个元素可出现的最大次数。)
- minOccurs(<minOccurs> 指示器可规定某个元素能够出现的最小次数。)
3. Group指示器:(Group 指示器用于定义相关的数批元素。)
- Group name
- attributeGroup name
元素组
元素组通过 group 声明进行定义:
<xs:group name="组名称">
...
</xs:group>
必须在 group 声明内部定义一个 all、choice 或者 sequence 元素。下面这个例子定义了名为 "persongroup" 的 group,它定义了必须按照精确的顺序出现的一组元素:
<xs:group name="persongroup">
<xs:sequence>
<xs:element na## Introduction
* **XML Schema是基于XML的DTD的替代者。**
* **XML Schema描述XML文档的结构。**
* **XML Schema语言也称作XML Schema定义(XML Schema Definition,XSD)。**
## Brief Description
**XML Schema的作用是定义XML文档的合法构建模块,类似DTD。**
* 定义可出现在文档中的元素
* 定义可出现在文档中的属性
* 定义哪个元素是子元素
* 定义子元素的次序
* 定义子元素的数目
* 定义元素是否为空,或者是否可包含文本
* 定义元素和属性的数据类型
* 定义元素和属性的默认值以及固定值
## **XML Schema支持数据类型**
XML Schema最重要的能力之一就是对数据类型的支持。
**通过对数据类型的支持:**
* 可更容易地描述允许的文档内容
* 可更容易地验证数据的正确性
* 可更容易地与来自数据库的数据一并工作
* 可更容易地定义数据约束(data facets)
* 可更容易地定义数据类型(或称数据格式)
* 可更容易地在不同的数据类型间转换数据
> 数据约束,或称 facets,是 XML Schema 原型中的一个术语,中文可译为“面”,用来约束数据类型的容许值。
# Simple Types
## Element
**简易元素**指那些只包含文本的元素。它不会包含任何其他的元素或属性。
不过,“仅包含文本”这个限定却很容易造成误解。文本有很多类型。它可以是 XML Schema 定义中包括的类型中的一种(布尔、字符串、数据等等),或者它也可以是您自行定义的定制类型。
您也可向数据类型添加限定(即 facets),以此来限制它的内容,或者您可以要求数据匹配某种特定的模式。
### Definition
**定义简易元素的语法:**
```xml
<xs:element name="xxx" type="yyy"/>
此处 xxx 指元素的名称,yyy 指元素的数据类型。XML Schema 拥有很多内建的数据类型。
最常用的类型:
- xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
简易元素可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。固定值同样会自动分配给元素,并且您无法规定另外一个值。
所有的属性均作为简易类型来声明。
简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本身总是作为简易类型被声明的。
定义属性的语法:
<xs:attribute name="xxx" type="yyy"/>
在此处,xxx 指属性名称,yyy 则规定属性的数据类型。XML Schema 拥有很多内建的数据类型。
最常用的类型:
- xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
Instance:
这是带有属性的XML元素:
<lastname lang="EN">Smith</lastname>
这是对应的属性定义:
<xs:attribute name="lang" type="xs:string"/>
属性可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。固定值同样会自动分配给元素,并且您无法规定另外的值。
在缺省的情况下,属性是可选的。如需规定属性为必选,请使用 "use" 属性:
<xs:attribute name="lang" type="xs:string" use="required"/>
当 XML 元素或属性拥有被定义的数据类型时,就会向元素或属性的内容添加限定。
假如 XML 元素的类型是 "xs:date",而其包含的内容是类似 "Hello World" 的字符串,元素将不会(通过)验证。
通过 XML schema,您也可向您的 XML 元素及属性添加自己的限定。这些限定被称为 facet(编者注:意为(多面体的)面,可译为限定面)。
限定(restriction)用于为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet。
- 对值的限定
- 对一组值的限定
- 对一系列值的限定
- 对一系列值的其他限定
- 对空白字符的限定
- 对长度的限定
限定 | 描述 |
---|---|
enumeration | 定义可接受*值的一个列表 |
fractionDigits | 定义所允许的最大的小数位数,必须大于等于0 |
length | 定义所允许的字符或者列表项目的精确数目,必须大于或者等于0 |
maxExclusive | 定义数值的上限,所允许的值必须小于此值 |
maxInclusive | 定义数值的上*限,所允许的值必须小于或等于此值 |
maxLength | 定义所允许的字符或者列表项目的最大数目,必须大于或等于0 |
minExclusive | 定义数值的下限,所允许的值必须大于此值 |
minInclusive | 定义数值的下限,所允许的值必须大于或等于此值 |
minLength | 定义所允许的字符或者列表项目的最小数目,必须大于或等于0 |
pattern | 定义可接受的字符的精确序列 |
totalDigits | 定义所允许的阿拉伯数字的精确位数,必须大于0 |
whiteSpace | 定义空白字符(换行、回车、空格以及制表符)的处理方式 |
Instance:
<xs:element name="car">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
上面的例子也可以被写为:
<xs:element name="car" type="carType"/>
<xs:simpleType name="carType">
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
**注释:**在这种情况下,类型 "carType" 可被其他元素使用,因为它不是 "car" 元素的组成部分。
复合元素包含了其他的元素及/或属性。
四中类型的复合元素:
- 空元素
- 包含其他元素的元素
- 仅包含文本的元素
- 包含元素和文本的元素
**注释:**上述元素均可包含属性!
Instances:
复合元素,“product”,是空的:
<product pid="1345"/>
复合元素,“employee”,仅包含其他元素:
<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>
复合元素,“food”,仅包含文本:
<food type="dessert">Ice cream</food>
复合元素,"description",包含元素和文本:
<description>
It happened on <date lang="norwegian">03.03.99</date> ....
</description>
- 通过命名此元素,可直接对"employee"元素进行声明,就像这样:
<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>
假如使用上面所描述的方法,那么仅有 "employee" 可使用所规定的复合类型。请注意其子元素,"firstname" 以及 "lastname",被包围在指示器 中。这意味着子元素必须以它们被声明的次序出现。
- "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="personinfo"/>
<xs:element name="student" type="personinfo"/>
<xs:element name="member" 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>
仅含文本的复合元素
此类型仅包含简易的内容(文本和属性)
混合的复合类型可包含属性、元素、以及文本。
XM元素,"letter",含有文本以及其他元素:
<letter>
Dear Mr.<name>John Smith</name>.
Your order <orderid>1032</orderid>
will be shipped on <shipdate>2001-07-13</shipdate>.
</letter>
下面这个 schema 声明了这个 "letter" 元素:
<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>
**注释:**为了使字符数据可以出现在 "letter" 的子元素之间,mixed 属性必须被设置为 "true"。xs:sequence 标签 (name、orderid 以及 shipdate ) 意味着被定义的元素必须依次出现在 "letter" 元素内部。
我们也可以为 complexType 元素起一个名字,并让 "letter" 元素的 type 属性引用 complexType 的这个名称(通过这个方法,若干元素均可引用同一个复合类型):
<xs:element name="letter" type="lettertype"/>
<xs:complexType name="lettertype" 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>
通过指示器,我们可以控制在文档中使用元素的方式。
有七种指示器:
1. Order指示器: (Order指示器用于定义元素的顺序。)
- All(<all> 指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次)(当使用 <all> 指示器时,你可以把 <minOccurs> 设置为 0 或者 1,而只能把 <maxOccurs> 指示器设置为 1)
- Choice(<choice> 指示器规定可出现某个子元素或者可出现另外一个子元素(非此即彼)(如需设置子元素出现任意次数,可将 <maxOccurs> 设置为 unbounded(无限次)。)
- Sequence(<sequence> 规定子元素必须按照特定的顺序出现)
2. Occurence指示器:(Occurrence 指示器用于定义某个元素出现的频率。)(对于所有的 "Order" 和 "Group" 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默认值均为 1。)
- maxOccurs(<maxOccurs> 指示器可规定某个元素可出现的最大次数。)
- minOccurs(<me="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:element name="birthday" type="xs:date"/> </xs:sequence> </xs:group>
在把 group 定义完毕以后,就可以在另一个定义中引用它了:
```xml
<xs:group name="persongroup">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="birthday" type="xs:date"/>
</xs:sequence>
</xs:group>
<xs:element name="person" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:group ref="persongroup"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
属性组
属性组通过 attributeGroup 声明来进行定义:
<xs:attributeGroup name="组名称">
...
</xs:attributeGroup>
**<any> 元素使我们有能力通过未被 schema 规定的元素来拓展 XML 文档! **
下面这个例子是从名为 "family.xsd" 的 XML schema 中引用的片段。它展示了一个针对 "person" 元素的声明。通过使用 元素,我们可以通过任何元素(在 之后)扩展 "person" 的内容:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:any minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
元素使我们有能力通过未被 schema 规定的属性来扩展 XML 文档!
下面的例子是来自名为 "family.xsd" 的 XML schema 的一个片段。它为我们展示了针对 "person" 元素的一个声明。通过使用 元素,我们就可以向 "person" 元素添加任意数量的属性:
<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:anyAttribute/>
</xs:complexType>
</xs:element>
通过 XML Schema,一个元素可对另一个元素进行替换。
我们可以在 XML schema 中定义一个 substitutionGroup。首先,我们声明主元素,然后我们会声明次元素,这些次元素可声明它们能够替换主元素。
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
为防止其他的元素替换某个指定的元素,请使用 block 属性:
<xs:element name="name" type="xs:string" block="substitution"/>
可替换元素的类型必须和主元素相同,或者从主元素衍生而来。假如可替换元素的类型与主元素的类型相同,那么您就不必规定可替换元素的类型了。
请注意,substitutionGroup 中的所有元*素(主元素和可替换元素)必须被声明为全局元素,否则就无法工作!
全局元素指 "schema" 元素的直接子元素!本地元素(Local elements)指嵌套在其他元素中的元素。
字符串数据类型可包含字符、换行、回车以及制表符。
注释: 如果您使用字符串数据类型,XML 处理器就不会更改其中的值。
规格化字符串数据类型源自于字符串数据类型。规格化字符串数据类型同样可包含字符,但是 XML 处理器会移除换行,回车以及制表符。
**注释:**XML 处理器会使用空格替换所有的制表符。
Token 数据类型同样源自于字符串数据类型。Token 数据类型同样可包含字符,但是 XML 处理器会移除换行符、回车、制表符、开头和结尾的空格以及(连续的)空格。
**注释:**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 | 不包含换行符、回车或制表符、开头或结尾空格或者多个连续空格的字符串 |
可与字符串数据类型一同使用的限定:
- enumeration
- length
- maxLength
- minLength
- pattern(NMTOKENS、IDREFS以及ENTITIES无法使用此约束)
- whiteSpace
日期使用此格式进行定义:"YYYY-MM-DD",其中:
- YYYY表示年份
- MM表示月份
- DD表示天数
**注释:**所有的成分都是必须的。
如需规定一个时区,您也可以通过在日期后加一个 "Z" 的方式,使用世界调整时间(UTC time)来输入一个日期。
<start>2002-09-24Z</start>
或者也可以通过在日期后添加一个正的或负时间的方法,来规定以世界调整时间为准的偏移量。
<start>2002-09-24-06:00</start>
时间使用下面的格式来定义:"hh:mm:ss",其中
- hh表示小时
- mm表示分钟
- ss表示秒
日期时间使用下面的格式进行定义:"YYYY-MM-DDThh:mm:ss",其中:
- YYYY 表示年份
- MM 表示月份
- DD 表示日
- T 表示必需的时间部分的起始
- hh 表示小时
- mm 表示分钟
- ss 表示秒
持续时间数据类型用于规定时间间隔。
时间间隔使用下面的格式来规定:"PnYnMnDTnHnMnS",其中:
- P 表示周期(必需)
- nY 表示年数
- nM 表示月数
- nD 表示天数
- T 表示时间部分的起始 (如果您打算规定小时、分钟和秒,则此选项为必需)
- nH 表示小时数
- nM 表示分钟数
- nS 表示秒数
Instance:
<period>P5Y2M10DT15H</period>
上面的例子表示一个 5 年、2 个月、10 天及 15 小时的周期。
如需规定一个负的持续时间,请在 P 之前输入减号。
<period>-P10D</period>
上面的例子表示一个负 10 天的周期。
名称 | 描述 |
---|---|
date | 定义一个日期值 |
dateTime | 定义一个日期和时间值 |
duration | 定义一个时间间隔 |
gDay | 定义日期的一个部分 - 天 (DD) |
gMonth | 定义日期的一个部分 - 月 (MM) |
gMonthDay | 定义日期的一个部分 - 月和天 (MM-DD) |
gYear | 定义日期的一个部分 - 年 (YYYY) |
gYearMonth | 定义日期的一个部分 - 年和月 (YYYY-MM) |
time | 定义一个时间值 |
可与日期数据类型一同使用的限定:
- enumeration
- maxExclusive
- maxInclusive
- minExclusive
- minInclusive
- pattern
- whiteSpace
- 十进制数据类型(可规定的十进制数字的最大位数是18位。)
- 整数数据类型
请注意,下面所有的数据类型均源自于十进制数据类型(除 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 位整数 |
可与数值数据类型一同使用的限定:
- enumeration
- fractionDigits
- maxExclusive
- maxInclusive
- minExclusive
- minInclusive
- pattern
- totalDigits
- whiteSpace
其他杂项数据类型包括逻辑、base64Binary、十六进制、浮点、双精度、anyURI、anyURI 以及 NOTATION。
逻辑数据类型用于规定true或false值。
**注释:**合法的布尔值是true、false、1(表示true)以及0(表示false)。
二进制数据类型用于表达二进制形式的数据。
可使用的两种二进制数据类型:
- base64Binary(Base64编码的二进制数据)
- hexBinary(十六进制编码的二进制数据)
anyURI数据类型用于规定URI。
下面是一个关于某个 scheme 中 anyURI 声明的例子:
<xs:attribute name="src" type="xs:anyURI"/>
文档中的元素看上去应该类似这样:
<pic src="http://www.w3school.com.cn/images/smiley.gif" />
**注释:**假如某个 URI 含有空格,请用 %20 替换它们。
杂项数据类型
名称 | 描述 |
---|---|
anyURI | |
base64Binary | |
boolean | |
double | |
float | |
hexBinary | |
NOTATION | |
QName |
可与杂项数据类型一同使用的限定:
- enumeration (布尔数据类型无法使用此约束)
- length (布尔数据类型无法使用此约束)
- maxLength (布尔数据类型无法使用此约束)
- minLength (布尔数据类型无法使用此约束)
- pattern
- whiteSpace