XMLschema.docx
《XMLschema.docx》由会员分享,可在线阅读,更多相关《XMLschema.docx(38页珍藏版)》请在冰点文库上搜索。
XMLschema
XMLSchema是基于XML的DTD替代者。
XMLSchema可描述XML文档的结构。
XMLSchema语言也可作为XSD(XMLSchemaDefinition)来引用。
您应当具备的基础知识
在继续学习之前,您需要对下面的知识有基本的了解:
∙HTML/XHTML
∙XML以及XML命名空间
∙对DTD的基本了解
如果您希望首先学习这些项目,请在首页访问这些教程。
什么是XMLSchema?
XMLSchema的作用是定义XML文档的合法构建模块,类似DTD。
XMLSchema:
∙定义可出现在文档中的元素
∙定义可出现在文档中的属性
∙定义哪个元素是子元素
∙定义子元素的次序
∙定义子元素的数目
∙定义元素是否为空,或者是否可包含文本
∙定义元素和属性的数据类型
∙定义元素和属性的默认值以及固定值
XMLSchema是DTD的继任者
我们认为XMLSchema很快会在大部分网络应用程序中取代DTD。
理由如下:
∙XMLSchema可针对未来的需求进行扩展
∙XMLSchema更完善,功能更强大
∙XMLSchema基于XML编写
∙XMLSchema支持数据类型
∙XMLSchema支持命名空间
XMLSchema是W3C标准
XMLSchema在2001年5月2日成为W3C标准。
XMLSchema比DTD更强大。
XMLSchema支持数据类型
XMLSchema最重要的能力之一就是对数据类型的支持。
通过对数据类型的支持:
∙可更容易地描述允许的文档内容
∙可更容易地验证数据的正确性
∙可更容易地与来自数据库的数据一并工作
∙可更容易地定义数据约束(datafacets)
∙可更容易地定义数据模型(或称数据格式)
∙可更容易地在不同的数据类型间转换数据
编者注:
数据约束,或称facets,是XMLSchema原型中的一个术语,中文可译为“面”,用来约束数据类型的容许值。
XMLSchema使用XML语法
另一个关于XMLSchema的重要特性是,它们由XML编写。
由XML编写XMLSchema有很多好处:
∙不必学习新的语言
∙可使用XML编辑器来编辑Schema文件
∙可使用XML解析器来解析Schema文件
∙可通过XMLDOM来处理Schema
∙可通过XSLT来转换Schema
XMLSchema可保护数据通信
当数据从发送方被发送到接受方时,其要点是双方应有关于内容的相同的“期望值”。
通过XMLSchema,发送方可以用一种接受方能够明白的方式来描述数据。
一种数据,比如"03-11-2004",在某些国家被解释为11月3日,而在另一些国家为当作3月11日。
但是一个带有数据类型的XML元素,比如:
2004-03-11,可确保对内容一致的理解,这是因为XML的数据类型"date"要求的格式是"YYYY-MM-DD"。
XMLSchema可扩展
XMLSchema是可扩展的,因为它们由XML编写。
通过可扩展的Schema定义,您可以:
∙在其他Schema中重复使用您的Schema
∙创建由标准类型衍生而来的您自己的数据类型
∙在相同的文档中引用多重的Schema
形式良好是不够的
我们把符合XML语法的文档称为形式良好的XML文档,比如:
∙它必须以XML声明开头
∙它必须拥有唯一的根元素
∙开始标签必须与结束标签相匹配
∙元素对大小写敏感
∙所有的元素都必须关闭
∙所有的元素都必须正确地嵌套
∙必须对特殊字符使用实体
即使文档的形式良好,仍然不能保证它们不会包含错误,并且这些错误可能会产生严重的后果。
请考虑下面的情况:
您订购的了5打激光打印机,而不是5台。
通过XMLSchema,大部分这样的错误会被您的验证软件捕获到。
XML文档可对DTD或XMLSchema进行引用。
一个简单的XML文档:
请看这个名为"note.xml"的XML文档:
xmlversion="1.0"?
>
George
John
Reminder
Don'tforgetthemeeting!
DTD文件
下面这个例子是名为"note.dtd"的DTD文件,它对上面那个XML文档的元素进行了定义:
ELEMENTnote(to,from,heading,body)>
ELEMENTto(#PCDATA)>
ELEMENTfrom(#PCDATA)>
ELEMENTheading(#PCDATA)>
ELEMENTbody(#PCDATA)>
第1行定义note元素有四个子元素:
"to,from,heading,body"。
第2-5行定义了to,from,heading,body元素的类型是"#PCDATA"。
XMLSchema
下面这个例子是一个名为"note.xsd"的XMLSchema文件,它定义了上面那个XML文档的元素:
xmlversion="1.0"?
>
schemaxmlns:
xs="http:
//www.w3.org/2001/XMLSchema"
targetNamespace=""
xmlns=""
elementFormDefault="qualified">
elementname="note">
complexType>
sequence>
elementname="to"type="xs:
string"/>
elementname="from"type="xs:
string"/>
elementname="heading"type="xs:
string"/>
elementname="body"type="xs:
string"/>
sequence>
complexType>
element>
schema>
note元素是一个复合类型,因为它包含其他的子元素。
其他元素(to,from,heading,body)是简易类型,因为它们没有包含其他元素。
您将在下面的章节学习更多有关复合类型和简易类型的知识。
对DTD的引用
此文件包含对DTD的引用:
xmlversion="1.0"?
>
DOCTYPEnoteSYSTEM"
George
John
Reminder
Don'tforgetthemeeting!
对XMLSchema的引用
此文件包含对XMLSchema的引用:
xmlversion="1.0"?
>
xmlns=""
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="note.xsd">
George
John
Reminder
Don'tforgetthemeeting!
元素是每一个XMLSchema的根元素。
元素
元素是每一个XMLSchema的根元素:
xmlversion="1.0"?
>
schema>
...
...
schema>
元素可包含属性。
一个schema声明往往看上去类似这样:
xmlversion="1.0"?
>
schemaxmlns:
xs="http:
//www.w3.org/2001/XMLSchema"
targetNamespace=""
xmlns=""
elementFormDefault="qualified">
...
...
schema>
代码解释:
下面的片断:
xmlns:
xs="http:
//www.w3.org/2001/XMLSchema"
显示schema中用到的元素和数据类型来自命名空间"http:
//www.w3.org/2001/XMLSchema"。
同时它还规定了来自命名空间"http:
//www.w3.org/2001/XMLSchema"的元素和数据类型应该使用前缀xs:
这个片断:
targetNamespace=""
显示被此schema定义的元素(note,to,from,heading,body)来自命名空间:
""。
这个片断:
xmlns=""
指出默认的命名空间是""。
这个片断:
elementFormDefault="qualified"
指出任何XML实例文档所使用的且在此schema中声明过的元素必须被命名空间限定。
在XML文档中引用Schema
此XML文档含有对XMLSchema的引用:
xmlversion="1.0"?
>
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="note.xsd">
George
John
Reminder
Don'tforgetthemeeting!
代码解释:
下面的片断:
xmlns=""
规定了默认命名空间的声明。
此声明会告知schema验证器,在此XML文档中使用的所有元素都被声明于""这个命名空间。
一旦您拥有了可用的XMLSchema实例命名空间:
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
您就可以使用schemaLocation属性了。
此属性有两个值。
第一个值是需要使用的命名空间。
第二个值是供命名空间使用的XMLschema的位置:
xsi:
schemaLocation="note.xsd"
XMLSchema可定义XML文件的元素。
简易元素指那些只包含文本的元素。
它不会包含任何其他的元素或属性。
什么是简易元素?
简易元素指那些仅包含文本的元素。
它不会包含任何其他的元素或属性。
不过,“仅包含文本”这个限定却很容易造成误解。
文本有很多类型。
它可以是XMLSchema定义中包括的类型中的一种(布尔、字符串、数据等等),或者它也可以是您自行定义的定制类型。
您也可向数据类型添加限定(即facets),以此来限制它的内容,或者您可以要求数据匹配某种特定的模式。
定义简易元素
定义简易元素的语法:
elementname="xxx"type="yyy"/>
此处xxx指元素的名称,yyy指元素的数据类型。
XMLSchema拥有很多内建的数据类型。
最常用的类型是:
∙xs:
string
∙xs:
decimal
∙xs:
integer
∙xs:
boolean
∙xs:
date
∙xs:
time
例子:
这是一些XML元素:
Smith
28
1980-03-27
这是相应的简易元素定义:
elementname="lastname"type="xs:
string"/>
elementname="age"type="xs:
integer"/>
elementname="dateborn"type="xs:
date"/>
简易元素的默认值和固定值
简易元素可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。
在下面的例子中,缺省值是"red":
elementname="color"type="xs:
string"default="red"/>
固定值同样会自动分配给元素,并且您无法规定另外一个值。
在下面的例子中,固定值是"red":
elementname="color"type="xs:
string"fixed="red"/>
所有的属性均作为简易类型来声明。
什么是属性?
简易元素无法拥有属性。
假如某个元素拥有属性,它就会被当作某种复合类型。
但是属性本身总是作为简易类型被声明的。
如何声明属性?
定义属性的语法是:
attributename="xxx"type="yyy"/>
在此处,xxx指属性名称,yyy则规定属性的数据类型。
XMLSchema拥有很多内建的数据类型。
最常用的类型是:
∙xs:
string
∙xs:
decimal
∙xs:
integer
∙xs:
boolean
∙xs:
date
∙xs:
time
实例
这是带有属性的XML元素:
Smith
这是对应的属性定义:
attributename="lang"type="xs:
string"/>
属性的默认值和固定值
属性可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。
在下面的例子中,缺省值是"EN":
attributename="lang"type="xs:
string"default="EN"/>
固定值同样会自动分配给元素,并且您无法规定另外的值。
在下面的例子中,固定值是"EN":
attributename="lang"type="xs:
string"fixed="EN"/>
可选的和必需的属性
在缺省的情况下,属性是可选的。
如需规定属性为必选,请使用"use"属性:
attributename="lang"type="xs:
string"use="required"/>
对内容的限定
当XML元素或属性拥有被定义的数据类型时,就会向元素或属性的内容添加限定。
假如XML元素的类型是"xs:
date",而其包含的内容是类似"HelloWorld"的字符串,元素将不会(通过)验证。
通过XMLschema,您也可向您的XML元素及属性添加自己的限定。
这些限定被称为facet(编者注:
意为(多面体的)面,可译为限定面)。
您会在下一节了解到更多有关facet的知识
限定(restriction)用于为XML元素或者属性定义可接受的值。
对XML元素的限定被称为facet。
对值的限定
下面的例子定义了带有一个限定且名为"age"的元素。
age的值不能低于0或者高于120:
elementname="age">
simpleType>
restrictionbase="xs:
integer">
minInclusivevalue="0"/>
maxInclusivevalue="120"/>
restriction>
simpleType>
element>
对一组值的限定
如需把XML元素的内容限制为一组可接受的值,我们要使用枚举约束(enumerationconstraint)。
下面的例子定义了带有一个限定的名为"car"的元素。
可接受的值只有:
Audi,Golf,BMW:
elementname="car">
simpleType>
restrictionbase="xs:
string">
enumerationvalue="Audi"/>
enumerationvalue="Golf"/>
enumerationvalue="BMW"/>
restriction>
simpleType>
element>
上面的例子也可以被写为:
elementname="car"type="carType"/>
simpleTypename="carType">
restrictionbase="xs:
string">
enumerationvalue="Audi"/>
enumerationvalue="Golf"/>
enumerationvalue="BMW"/>
restriction>
simpleType>
注释:
在这种情况下,类型"carType"可被其他元素使用,因为它不是"car"元素的组成部分。
对一系列值的限定
如需把XML元素的内容限制定义为一系列可使用的数字或字母,我们要使用模式约束(patternconstraint)。
下面的例子定义了带有一个限定的名为"letter"的元素。
可接受的值只有小写字母a-z其中的一个:
elementname="letter">
simpleType>
restrictionbase="xs:
string">
patternvalue="[a-z]"/>
restriction>
simpleType>
element>
下一个例子定义了带有一个限定的名为"initials"的元素。
可接受的值是大写字母A-Z其中的三个:
elementname="initials">
simpleType>
restrictionbase="xs:
string">
patternvalue="[A-Z][A-Z][A-Z]"/>
restriction>
simpleType>
element>
下一个例子也定义了带有一个限定的名为"initials"的元素。
可接受的值是大写或小写字母a-z其中的三个:
elementname="initials">
simpleType>
restrictionbase="xs:
string">
patternvalue="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
restriction>
simpleType>
element>
下一个例子定义了带有一个限定的名为"choice的元素。
可接受的值是字母x,y或z中的一个:
elementname="choice">
simpleType>
restrictionbase="xs:
string">
patternvalue="[xyz]"/>
restriction>
simpleType>
element>
下一个例子定义了带有一个限定的名为"prodid"的元素。
可接受的值是五个阿拉伯数字的一个序列,且每个数字的范围是0-9:
elementname="prodid">
simpleType>
restrictionbase="xs:
integer">
patternvalue="[0-9][0-9][0-9][0-9][0-9]"/>
restriction>
simpleType>
element>
对一系列值的其他限定
下面的例子定义了带有一个限定的名为"letter"的元素。
可接受的值是a-z中零个或多个字母:
elementname="letter">
simpleType>
restrictionbase="xs:
string">
patternvalue="([a-z])*"/>
restriction>
simpleType>
element>
下面的例子定义了带有一个限定的名为"letter"的元素。
可接受的值是一对或多对字母,每对字母由一个小写字母后跟一个大写字母组成。
举个例子,"sToP"将会通过这种模式的验证,但是"Stop"、"STOP"或者"stop"无法通过验证:
elementname="letter">
simpleType>
restrictionbase="xs:
string">
patternvalue="([a-z][A-Z])+"/>
restriction>
simpleType>
element>
下面的例子定义了带有一个限定的名为"gender"的元素。
可接受的值是male或者female: