基本的
XML Schema
的使用就是這樣,下面我們要介紹
XML Schema
的另外一個(gè)核心的部分也是
Schema
最關(guān)鍵的一個(gè)部分,就是關(guān)于
Schema
的名字空間(
namespace
)的問題。在上面關(guān)于
XML Schema
的介紹中,為了把讀者集中到對
XML Schema
的語法理解上,特意省略了關(guān)于名字空間
(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}'/
>
<
!-
上面的一行代碼表示商品編碼的第一個(gè)字符應(yīng)該為字母,后面跟六個(gè)阿拉伯?dāng)?shù)字
--
>
<
/xsd:simpleType
>
現(xiàn)在大家需要把注意力集中到開頭幾行的代碼上來,如下:
<
xsd:schema
targetNamespace='http://www.SampleStore.com/Account'
xmlns:xsd
='http://www.w3.org/2000/08/xmlSchema'
xmlns:ACC
= 'http://www.SampleStore.com/Account'
>
實(shí)際上,一個(gè)給定的
XML Schema
定義了一系列的元素名稱,類型名稱,屬性名稱和屬性組名稱。比如上面的代碼中的訂單號碼、商品編號、商品編號類型等。而這些名稱都有它一定的作用范圍,類似于
C++
中的局部變量的概念。而它們的作用范圍是什么呢?就是在他們的目標(biāo)名字空間(
target namespace
)中是有效的
,
在上面的代碼中,我們可以看到它的目標(biāo)名字空間為
http://www.SampleStore.com/Account
。
需要注意的是,目標(biāo)名字空間的命名必須遵守
URL
的語義。同時(shí)需要注意的是,該目標(biāo)名字空間并不是指一個(gè)具體的文件,僅僅是給它一個(gè)名字而已。實(shí)際上,在
Schema
中的定義和聲明也可以引用其他的名字空間,我們可以把這種名字空間取名為源名字空間(
source namespaces
)。每一個(gè)
Schema
必須有一個(gè)目標(biāo)名字空間,但是可以有多個(gè)源名字空間。
實(shí)際上,在一個(gè)給定的
Schema
中,每一個(gè)名稱都是屬于一個(gè)特定的名字空間的。名字空間的名稱可能會(huì)很長(比如
http://www.SampleStore.com/Account
),但是它們可以用在
XML Schema
中的語義
xmlns
來進(jìn)行簡化。在上面的例子中,我們用
xsd
(取名為
xsd
是任意的,比如你可以取名為
kkk,tt,ppp,gh
都可以)來表示名字空間
'http://www.w3.org/2000/08/xmlSchema'
,用
ACC
來表示名字空間
http://www.SampleStore.com/Account
。同時(shí)我們把
http://www.w3.org/2000/08/xmlSchema
這個(gè)名字空間稱為標(biāo)準(zhǔn)名字空間(
standard namespace
),因?yàn)樗嵌x
Schema
語法的標(biāo)準(zhǔn)地
在上面的代碼中,目標(biāo)名字空間(
targetNamespace
)包含了名字訂單號碼、商品編號、商品編號類型。而名字
schema,element,simpleType,pattern,string
和
positiveInteger
是屬于標(biāo)準(zhǔn)名字空間
http://www.w3.org/2000/08/xmlSchema
的。也就是說,它們的意義是在
http://www.w3.org/2000/08/xmlSchema
中進(jìn)行定義的。實(shí)際上,所有標(biāo)準(zhǔn)的
XML Schmea
語法、語義和數(shù)據(jù)結(jié)構(gòu)都在
http://www.w3.org/2000/08/xmlSchema
中進(jìn)行定義。這樣解析器碰到一個(gè)名稱
(
如
schema,element
等等
)
的時(shí)候,就知道應(yīng)該在哪里去得到關(guān)于它的正確的語義的使用方法。
對于標(biāo)準(zhǔn)名字空間和目標(biāo)名字空間,我們不需要指定它的
SchemaLocation
。因?yàn)閷τ谀繕?biāo)名字空間來講,
SchemaLocation
就是文檔自己。對于標(biāo)準(zhǔn)名字空間來講,它是眾所周知的,也不需要指定。而對于源目標(biāo)空間來講,就需要指定它的
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:
手表類型
'/
>
在談關(guān)于源目標(biāo)空間的
schemaLocation
之前,我們先看一下這行代碼:
xmlns='http://www.w3.org/1999/xmlSchema'
它表示什么呢?它表示在文檔中所有的名字前面如果沒有前綴的,就是由
http://www.w3.org/1999/xmlSchema
進(jìn)行定義和解析的。這樣無疑是很合理的。因?yàn)槭聦?shí)上,我們
XML Schema
中的很多名稱
(
比如
schema,element,simpleType,pattern
等等
)
都是來自這個(gè)標(biāo)準(zhǔn)名字空間的,反復(fù)往前面加前綴,你煩不煩呀?所以干脆把它定義成默認(rèn)的,所以如果一個(gè)名稱前面沒有前綴,就認(rèn)定它是由
http://www.w3.org/1999/xmlSchema
進(jìn)行處理的。
好,接下來我們來注意
<
import namespace='http://www.PartnerStore.com/PartsCatalog'
schemaLocation='http://www.ProductStandards.org/repository/alpha.xsd'/
>
這段代碼,因?yàn)?/span>
http://www.PartnerStore.com/PartsCatalog
是一個(gè)源名字空間,所以必須指定它的
schemaLocation
,采用關(guān)鍵字
import
來引入這個(gè)
schemaLocation
。
注意到下面這行代碼
<
element name='
手表
' type='PART:
手表類型
'/
>
它表示元素手表的類型(
type
)手表類型是在
http://www.PartnerStore.com/PartsCatalog
中進(jìn)行定義的。解析器如果要尋找關(guān)于手表類型的定義,需要在名字空間
http://www.PartnerStore.com/PartsCatalog
下進(jìn)行尋找。
到此為止,你應(yīng)該對名字空間有了一個(gè)比較感性的理解。
posted on 2007-01-19 00:11
苦笑枯 閱讀(244)
評論(0) 編輯 收藏 所屬分類:
Xml