Posted on 2008-10-22 17:11
semovy 閱讀(382)
評論(0) 編輯 收藏 所屬分類:
XML相關
為何需要XML Schema
在當今的IT行業中,XML被賦予了越來越多的職責和功能,例如,作為文本數據庫存儲數據,作為某一行業中數據交換的標準表示,等等。這些都需要相應的XML文件中對數據的描述,如數據類型、長度進行嚴格的定義,這樣才能真正做到數據的安全性和行業統一標準并有通用的規則對其進行解析。
然而,XML在其產生的時候就被定義為高開放性,用文本方式瀏覽,用標簽來定義的標記語言,鑒于XML的這些特點,就像HTML文件一樣,XML文件本身無法對文件中的數據進行嚴格的定義。
為了解決以上的矛盾,XML Schema應運而生了,它是用來定義XML文件的文本結構,數據類型等XML文件描述規則的。
何為XML Schema
其實,XML Schema本身也是一個xml文件,所不同的是,Schema文件所描述的是對引用它的xml文件的element和attribute的具體類型的。作為一個Schema文件,其特殊的文件頭格式為:
<?xml version="1.0"?>ß ------------------------------------------xml文件頭
<Schema name="schema_sample_1" ß ------------------------ 名稱(可省略)
xmlns="urn:schemas-microsoft-com:xml-data" ß --------- 引用微軟Schema類型定義(可省略)
xmlns:dt="urn:schemas-microsoft-com:datatypes">ß -----引用微軟Schema數據類型定義(可省略)
<!--…………..- 〉 ß ---------------------------------------------- 具體文件內容
</Schema>
必須注意的是,在一個定義Schema的xml文件中,文件的root一定為<Schema>…</Schema>,
在文件的具體內容中,你可以添加你對某個xml結構、數據類型的定義,請看下例:
<?xml version="1.0"?>
<catalog>
<book>
<title>Presenting XML</title>
<author>Richard Light</author>
<pages>334</pages>
</book>
<book>
<title>XML</title>
<author>Jane Lee</author>
<pages>450</pages>
</book>
</catalog>
這是一個表示書目錄的xml文件,對每一本書的介紹,我們都要有一些數據上的規定,如,“書名”、“作者名”和“頁數”都應該是唯一的,“作者名”應該為字符串類型,而“頁數”應該為整數類型的,對每本“book”來說,只能有所指定的三個元素。
為了能實現上述要求,我們定義了如下schema:
<?xml version="1.0"?>
<Schema>
<ElementType name="title" content="textOnly" model="closed" />
<ElementType name="author" content="textOnly" dt:type=”string” model="closed" />
<ElementType name="pages" content="textOnly" dt:type=”int” model="closed" />
<ElementType name="book" content="eltOnly" model="closed" order=”seq”>
<element type="title" />
<element type="author" />
<element type="pages" />
</ElementType>
</Schema>
在以下的文章中,將詳細的描述內容中的具體意義。
ElementType
ElementType是schema中最基本的,它用來定義xml文件中元素的格式,數據類型等。
定義一個ElementType的基本格式為:
<ElementType
content="{empty | textOnly | eltOnly | mixed}"
dt:type="datatype"
model="{open | closed}"
name="idref"
order="{one | seq | many}" >
</ElementType>
content
Content用于描述元素中的內容類型。
empty
元素內容為空
textOnly
元素只包含文本類型的內容
eltOnly
元素只包含元素類型的內容
mixed
元素內容包含上述任何情況
<ElementType name="x" content="empty"/>
<ElementType name="x" content="textOnly"/>
<ElementType name="x" content="eltOnly">
<element type="y">
</ElementType>
<ElementType name="x" content="mixed">
<element type='q'>
<element type='r'>
</ElementType>
model
Model定義元素的內容是否要嚴格的遵守schema中的定義。
open
元素內容可添加未特殊定義過的元素,特征,文本等
closed
元素內容只能添加特殊定義過的元素,特征,文本等
<ElementType name="x" model="open"/>
<ElementType name="y" model="close"/>
name
定義該元素的名稱
<ElementType name="x"></ElementType>
order
定義該元素子元素的排列順序
one
只允許元素內容按一種方式排列
seq
允許元素內容按指定的方式排列
many
按任意方式排列
<ElementType name='z' order="one">
<element type="x">
<element type="y">
</ElementType>
<ElementType name="x" order="one">
<group order="seq">
<element type="x1">
<element type="y1">
</group>
<group order="seq">
<element type="x2">
<element type="y2">
</group>
</ElementType>
<ElementType name="x" content="eltOnly" order="many">
<element type='q'>
<element type='r'>
</ElementType>
特別注明,seq只元素內容可以按特殊列出的排列順序中任選一種。
Dt:type
用于指定元素文本的數據類型
boolean
布爾型
char
字符型
date
日期型
Date time
日期時間型
Float
實型
Int
整型
Number
數字型
Time
時間型
Uri
Universal Resource Identifier,如"urn:schemas-microsoft-com:Office9"
Uuid
例如"333C7BC4-460F-11D0-BC04-0080C7055A83".
entity
xml補充類型
entities
xml補充類型
enumeration
xml補充類型
id
xml補充類型
idref
xml補充類型
idrefs
xml補充類型
nmtoken
xml補充類型
nmtokens
xml補充類型
notation
xml補充類型
string
字符串類型
<ElementType dt:type=”int”></Element>
上表中只列舉了一部分常見數據類型,如果您想得到關于dt:type更詳細的信息,請瀏覽MSDN。
除此之外,元素類型可以有另外一種方式,即引用一個已有的ElementType,請看下例:
<ElementType name="pages" content="textOnly" dt:type=”int” model="closed" />
<ElementType name="book" content="eltOnly" model="closed" order=”seq”>
<element type="pages" />
</ElementType>
在元素book的定義中,為其定義了一個子元素,子元素的類型引用元素pages的定義。
AttrributeType
Attribute也是xml的元素之一,用它可以表示Element中的某些特征,自然,我們也希望對attribute的數據結構和數據類型作定義。
定義AttributeType的基本格式為
<AttributeType
default="default-value"
dt:type="primitive-type"
dt:values="enumerated-values"
name="idref"
required="{yes | no}" >
default
設定attribute的默認值,必須注意的是,default的值也必須符合AttributeType中其他對數據結構的定義
Dt:type
用于指定Attribute的數據類型
boolean
布爾型
char
字符型
date
日期型
Date time
日期時間型
Float
實型
Int
整型
Number
數字型
Time
時間型
Uri
Universal Resource Identifier,如"urn:schemas-microsoft-com:Office9"
Uuid
例如"333C7BC4-460F-11D0-BC04-0080C7055A83".
entity
xml補充類型
entities
xml補充類型
enumeration
xml補充類型
id
xml補充類型
idref
xml補充類型
idrefs
xml補充類型
nmtoken
xml補充類型
nmtokens
xml補充類型
notation
xml補充類型
string
字符串類型
<AttributeType dt:type=”int”>
AttributeType的datatype類型與ElementType的datatype類型是相同的,上表中只列舉了一部分常見數據類型,如果您想得到關于dt:type更詳細的信息,請瀏覽MSDN。
Dt:values
當dt:type為enumeration型時,定義attribute的可能值列表,attribute的值將在這些值中選取
<AttributeType name="colors" dt:type="enumeration"
dt:values="red green blue">
name
定義attribute的名稱
required
定義該attribute是否一定要包含在element中
yes
一定要包含
no
不一定要包含
AttributeType與ElementType一樣,也可以引用已有的AttributeType定義:
description
description是一種注釋,用于說明Schema的定義內容。
<ElementType name="Book">
<description>
This is how we describe the books we sell. Be sure to specify
the ageGroup!
</description>
<element type="ageGroup">
<default>ADULT</default>
</element>
</ElementType>
group Element
group用來按一定序列,將element組織成group
group的表達形式為
<group
maxOccurs="{1 | *}"
minOccurs="{0 | 1}"
order="{one | seq | many}" >
maxOccurs
定義該group出現的最多次數
1
只能調用一次
*
可以調用任意次
minOccurs
定義該group出現的最少次數
0
無要求
1
至少調用一次
order
定義該group中element的排列順序
one
只允許元素內容按一種方式排列
seq
允許元素內容按指定的方式排列
many
按任意方式排列
<ElementType name="x" order="one">
<group order="seq">
<element type="x1">
<element type="y1">
</group>
<group order="seq">
<element type="x2">
<element type="y2">
</group>
</ElementType>
Extensibility
Xml Schema時刻擴展的,他們建立在一個開放的內容模式上,在Schema文檔上可以任意的添加elemtnt和attribute,如下例,你可以利用其extensibility機制,對element “page”加以限制條件,由namespace “myEXT”擴展的tag,限制了書本的頁數必須在50至100頁之間。
<ElementType name="pages" xmlns:myExt="urn:myschema-extensions">
<datatype dt:type="int" />
<myExt:min>50</myExt:min>
<myExt:max>100</myExt:max>
</ElementType>
如何在XML文件中引用XML Schema
要在一個XML文件中引用一個Schema,只需在相應的element處注明,一般格式為:
<”elementname” xmlns=” x-schema:[the url of the schema file]” >
例如:
<book xmlns="x-schema:http://www.microsoft.com/xml/schema/book.xml">
<title>Presenting XML</title>
<author>Richard Light</author>
<pages>334</pages>
</book>
Schema 與 DTDs
在Schema之前,另有一種定義XML結構的方式,即DTDs,兩者的區別在于:
1 XML Schemas是XML文檔,而DTDs有自己的特殊語法,這樣,你只需懂得XML的語法規則即可編寫Schema,無需學習其他語法規則;xml文件與xml schema文件可以用相同的語法分析器來解析,而無須寫兩套分析器;xml schema有強大、易用的擴展功能。
2 XML Schema利用名域將文檔中特殊的節點與schema說明相聯系,一個xml文件可以有多個對應的schema,而用DTDs的話,一個xml文件只能由一個相對應的DTDs。
3 XML schemas內容模型是開放的,可以隨意擴充,而DTDs將無法解析擴充的內容。
4 DTDs只能把內容類型定義為一個字符串。而XML schemas允許你把內容類型定義為整型、浮點型、數據型、布爾型或者許多其他的簡單數據類型,而無須重定義。
實例分析
現在我們來分析一下第二節中所舉的schema例子定義了什么:
<?xml version="1.0"?>
<Schema>
<ElementType name="title" content="textOnly" model="closed" />
<ElementType name="author" content="textOnly" dt:type=”string” model="closed" />
<ElementType name="pages" content="textOnly" dt:type=”int” model="closed" />
<ElementType name="book" content="eltOnly" model="closed" order=”seq”>
<element type="title" />
<element type="author" />
<element type="pages" />
</ElementType>
</Schema>
該schema文件定義了四種element type:
title:只能有文本內容
author:只能有文本內容,數據類型為字符串型
pages:只能有文本內容,數據類型為整型
book:只能包含子元素,并且子元素的排列順序必須按照schema所規定的順序
book元素包含分別用,title,author,pages所定義的三個子元素。