xml schema - QLGQ/learning-python GitHub Wiki

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

定义简易元素的语法:

<xs:element name="xxx" type="yyy"/>

此处 xxx 指元素的名称,yyy 指元素的数据类型。XML Schema 拥有很多内建的数据类型。

最常用的类型:

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time

Defaul & Fixed

简易元素可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。固定值同样会自动分配给元素,并且您无法规定另外一个值。

Attribute

所有的属性均作为简易类型来声明。
简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本身总是作为简易类型被声明的。

Statement(How To State Attribute)

定义属性的语法:

<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"/>

Defaul & Fixed

属性可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。固定值同样会自动分配给元素,并且您无法规定另外的值。

Optional & Necessary

在缺省的情况下,属性是可选的。如需规定属性为必选,请使用 "use" 属性:

<xs:attribute name="lang" type="xs:string" use="required"/>

Restriction To Content

当 XML 元素或属性拥有被定义的数据类型时,就会向元素或属性的内容添加限定。
假如 XML 元素的类型是 "xs:date",而其包含的内容是类似 "Hello World" 的字符串,元素将不会(通过)验证。
通过 XML schema,您也可向您的 XML 元素及属性添加自己的限定。这些限定被称为 facet(编者注:意为(多面体的)面,可译为限定面)。

Facets

限定(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" 元素的组成部分。

Complex Types

Element

复合元素包含了其他的元素及/或属性。
四中类型的复合元素:

  • 空元素
  • 包含其他元素的元素
  • 仅包含文本的元素
  • 包含元素和文本的元素

**注释:**上述元素均可包含属性!

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>

Definition

  1. 通过命名此元素,可直接对"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",被包围在指示器 中。这意味着子元素必须以它们被声明的次序出现。

  1. "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>

XSD 指示器

通过指示器,我们可以控制在文档中使用元素的方式。

有七种指示器:
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

Defaul & Fixed

简易元素可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。固定值同样会自动分配给元素,并且您无法规定另外一个值。

Attribute

所有的属性均作为简易类型来声明。
简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本身总是作为简易类型被声明的。

Statement(How To State Attribute)

定义属性的语法:

<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"/>

Defaul & Fixed

属性可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。固定值同样会自动分配给元素,并且您无法规定另外的值。

Optional & Necessary

在缺省的情况下,属性是可选的。如需规定属性为必选,请使用 "use" 属性:

<xs:attribute name="lang" type="xs:string" use="required"/>

Restriction To Content

当 XML 元素或属性拥有被定义的数据类型时,就会向元素或属性的内容添加限定。
假如 XML 元素的类型是 "xs:date",而其包含的内容是类似 "Hello World" 的字符串,元素将不会(通过)验证。
通过 XML schema,您也可向您的 XML 元素及属性添加自己的限定。这些限定被称为 facet(编者注:意为(多面体的)面,可译为限定面)。

Facets

限定(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" 元素的组成部分。

Complex Types

Element

复合元素包含了其他的元素及/或属性。
四中类型的复合元素:

  • 空元素
  • 包含其他元素的元素
  • 仅包含文本的元素
  • 包含元素和文本的元素

**注释:**上述元素均可包含属性!

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>

Definition

  1. 通过命名此元素,可直接对"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",被包围在指示器 中。这意味着子元素必须以它们被声明的次序出现。

  1. "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>

XSD 指示器

通过指示器,我们可以控制在文档中使用元素的方式。

有七种指示器:
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>元素

**<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>

<anyAttribute>元素

元素使我们有能力通过未被 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>

XSD Element Substitution

Element Substitution

通过 XML Schema,一个元素可对另一个元素进行替换。
我们可以在 XML schema 中定义一个 substitutionGroup。首先,我们声明主元素,然后我们会声明次元素,这些次元素可声明它们能够替换主元素。

<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>

Block Element Substitution

为防止其他的元素替换某个指定的元素,请使用 block 属性:

<xs:element name="name" type="xs:string" block="substitution"/>

SubstitutionGroup

可替换元素的类型必须和主元素相同,或者从主元素衍生而来。假如可替换元素的类型与主元素的类型相同,那么您就不必规定可替换元素的类型了。
请注意,substitutionGroup 中的所有元*素(主元素和可替换元素)必须被声明为全局元素,否则就无法工作!

Global Elements

全局元素指 "schema" 元素的直接子元素!本地元素(Local elements)指嵌套在其他元素中的元素。

Data Type

String Data Type

字符串数据类型可包含字符、换行、回车以及制表符。
注释: 如果您使用字符串数据类型,XML 处理器就不会更改其中的值。

NormalizedString Data Type

规格化字符串数据类型源自于字符串数据类型。规格化字符串数据类型同样可包含字符,但是 XML 处理器会移除换行,回车以及制表符。
**注释:**XML 处理器会使用空格替换所有的制表符。

Token Data Type

Token 数据类型同样源自于字符串数据类型。Token 数据类型同样可包含字符,但是 XML 处理器会移除换行符、回车、制表符、开头和结尾的空格以及(连续的)空格。
**注释:**XML 解析器会移除制表符。

String Data Type

请注意,所有以下的数据类型均衍生于字符串数据类型(除了字符串数据类型本身)!

名称 描述
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 To String Data Type

可与字符串数据类型一同使用的限定:

  • 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>

Time Data Type

时间使用下面的格式来定义:"hh:mm:ss",其中

  • hh表示小时
  • mm表示分钟
  • ss表示秒

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 表示秒数

Instance:

<period>P5Y2M10DT15H</period>

上面的例子表示一个 5 年、2 个月、10 天及 15 小时的周期。

负的持续时间

如需规定一个负的持续时间,请在 P 之前输入减号。

<period>-P10D</period>

上面的例子表示一个负 10 天的周期。

Date and Time Data Types

名称 描述
date 定义一个日期值
dateTime 定义一个日期和时间值
duration 定义一个时间间隔
gDay 定义日期的一个部分 - 天 (DD)
gMonth 定义日期的一个部分 - 月 (MM)
gMonthDay 定义日期的一个部分 - 月和天 (MM-DD)
gYear 定义日期的一个部分 - 年 (YYYY)
gYearMonth 定义日期的一个部分 - 年和月 (YYYY-MM)
time 定义一个时间值

Restriction To Date and Time Data Types

可与日期数据类型一同使用的限定:

  • enumeration
  • maxExclusive
  • maxInclusive
  • minExclusive
  • minInclusive
  • pattern
  • whiteSpace

Numeric Data Types

  • 十进制数据类型(可规定的十进制数字的最大位数是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 位整数

Restriction To Numeric Data Types

可与数值数据类型一同使用的限定:

  • enumeration
  • fractionDigits
  • maxExclusive
  • maxInclusive
  • minExclusive
  • minInclusive
  • pattern
  • totalDigits
  • whiteSpace

Miscellaneous Data Types

其他杂项数据类型包括逻辑、base64Binary、十六进制、浮点、双精度、anyURI、anyURI 以及 NOTATION。

Boolean Data Type

逻辑数据类型用于规定true或false值。
**注释:**合法的布尔值是true、false、1(表示true)以及0(表示false)。

Binary Data Types

二进制数据类型用于表达二进制形式的数据。
可使用的两种二进制数据类型:

  • base64Binary(Base64编码的二进制数据)
  • hexBinary(十六进制编码的二进制数据)

AnyURI Data Type

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

对杂项数据类型的限定(Restriction)

可与杂项数据类型一同使用的限定:

  • enumeration (布尔数据类型无法使用此约束)
  • length (布尔数据类型无法使用此约束)
  • maxLength (布尔数据类型无法使用此约束)
  • minLength (布尔数据类型无法使用此约束)
  • pattern
  • whiteSpace
⚠️ **GitHub.com Fallback** ⚠️