基本的
XML Schema
的使用就是这样,下面我们要介绍
XML Schema
的另外一个核心的部分也是
Schema
最关键的一个部分,就是关于
Schema
的名字空间(
namespace
)的问题。在上面关于
XML Schema
的介绍中,为了把读者集中到对
XML Schema
的语法理解上,特意省略了关于名字空间
(namespace)
的介绍。
首先我们还是从简单的例子着手,见下面的一段代码:
<
xsd:schema
targetNamespace='http://www.SampleStore.com/Account'
xmlns:xsd
='http://www.w3.org/2000/08/xmlSchema'
xmlns:ACC
= 'http://www.SampleStore.com/Account'
>
<
xsd:element
name='
订单号码
' type='xsd:positiveInteger'/
>
<
xsd:element
name='
商品编号
' type='ACC:
商品编号类型
'/
>
<
xsd:simpleType
name='
商品编号类型
' base='xsd:string'
>
<
xsd:pattern
='[A-Z]{1}d{6}'/
>
<
!-
上面的一行代码表示商品编码的第一个字符应该为字母,后面跟六个阿拉伯数字
--
>
<
/xsd:simpleType
>
现在大家需要把注意力集中到开头几行的代码上来,如下:
<
xsd:schema
targetNamespace='http://www.SampleStore.com/Account'
xmlns:xsd
='http://www.w3.org/2000/08/xmlSchema'
xmlns:ACC
= 'http://www.SampleStore.com/Account'
>
实际上,一个给定的
XML Schema
定义了一系列的元素名称,类型名称,属性名称和属性组名称。比如上面的代码中的订单号码、商品编号、商品编号类型等。而这些名称都有它一定的作用范围,类似于
C++
中的局部变量的概念。而它们的作用范围是什么呢?就是在他们的目标名字空间(
target namespace
)中是有效的
,
在上面的代码中,我们可以看到它的目标名字空间为
http://www.SampleStore.com/Account
。
需要注意的是,目标名字空间的命名必须遵守
URL
的语义。同时需要注意的是,该目标名字空间并不是指一个具体的文件,仅仅是给它一个名字而已。实际上,在
Schema
中的定义和声明也可以引用其他的名字空间,我们可以把这种名字空间取名为源名字空间(
source namespaces
)。每一个
Schema
必须有一个目标名字空间,但是可以有多个源名字空间。
实际上,在一个给定的
Schema
中,每一个名称都是属于一个特定的名字空间的。名字空间的名称可能会很长(比如
http://www.SampleStore.com/Account
),但是它们可以用在
XML Schema
中的语义
xmlns
来进行简化。在上面的例子中,我们用
xsd
(取名为
xsd
是任意的,比如你可以取名为
kkk,tt,ppp,gh
都可以)来表示名字空间
'http://www.w3.org/2000/08/xmlSchema'
,用
ACC
来表示名字空间
http://www.SampleStore.com/Account
。同时我们把
http://www.w3.org/2000/08/xmlSchema
这个名字空间称为标准名字空间(
standard namespace
),因为它是定义
Schema
语法的标准地
在上面的代码中,目标名字空间(
targetNamespace
)包含了名字订单号码、商品编号、商品编号类型。而名字
schema,element,simpleType,pattern,string
和
positiveInteger
是属于标准名字空间
http://www.w3.org/2000/08/xmlSchema
的。也就是说,它们的意义是在
http://www.w3.org/2000/08/xmlSchema
中进行定义的。实际上,所有标准的
XML Schmea
语法、语义和数据结构都在
http://www.w3.org/2000/08/xmlSchema
中进行定义。这样解析器碰到一个名称
(
如
schema,element
等等
)
的时候,就知道应该在哪里去得到关于它的正确的语义的使用方法。
对于标准名字空间和目标名字空间,我们不需要指定它的
SchemaLocation
。因为对于目标名字空间来讲,
SchemaLocation
就是文档自己。对于标准名字空间来讲,它是众所周知的,也不需要指定。而对于源目标空间来讲,就需要指定它的
SchemaLocation
。见下面的例子:
<
schema targetNamespace='http://www.SampleStore.com/Account'
xmlns
='http://www.w3.org/1999/xmlSchema'
xmlns:ACC
= 'http://www.SampleStore.com/Account'
xmlns:PART
= 'http://www.PartnerStore.com/PartsCatalog'
>
<
import namespace='http://www.PartnerStore.com/PartsCatalog'
schemaLocation='http://www.ProductStandards.org/repository/alpha.xsd'/
>
<
element name='
订单号码
' type='positiveInteger'/
>
<
element name='
商品编号
' type='ACC:
商品编号类型
'/
>
<
simpleType
name='
商品编号类型
' base='string'
>
<
pattern ='[A-Z]{1}d{6}'/
>
<
/simpleType
>
<
element name='
手表
' type='PART:
手表类型
'/
>
在谈关于源目标空间的
schemaLocation
之前,我们先看一下这行代码:
xmlns='http://www.w3.org/1999/xmlSchema'
它表示什么呢?它表示在文档中所有的名字前面如果没有前缀的,就是由
http://www.w3.org/1999/xmlSchema
进行定义和解析的。这样无疑是很合理的。因为事实上,我们
XML Schema
中的很多名称
(
比如
schema,element,simpleType,pattern
等等
)
都是来自这个标准名字空间的,反复往前面加前缀,你烦不烦呀?所以干脆把它定义成默认的,所以如果一个名称前面没有前缀,就认定它是由
http://www.w3.org/1999/xmlSchema
进行处理的。
好,接下来我们来注意
<
import namespace='http://www.PartnerStore.com/PartsCatalog'
schemaLocation='http://www.ProductStandards.org/repository/alpha.xsd'/
>
这段代码,因为
http://www.PartnerStore.com/PartsCatalog
是一个源名字空间,所以必须指定它的
schemaLocation
,采用关键字
import
来引入这个
schemaLocation
。
注意到下面这行代码
<
element name='
手表
' type='PART:
手表类型
'/
>
它表示元素手表的类型(
type
)手表类型是在
http://www.PartnerStore.com/PartsCatalog
中进行定义的。解析器如果要寻找关于手表类型的定义,需要在名字空间
http://www.PartnerStore.com/PartsCatalog
下进行寻找。
到此为止,你应该对名字空间有了一个比较感性的理解。
posted on 2007-01-19 00:11
苦笑枯 阅读(239)
评论(0) 编辑 收藏 所属分类:
Xml