Schema驗證XML概念的實例程式碼詳解

黄舟
發布: 2018-05-28 10:47:39
原創
2068 人瀏覽過

1.Schema 檔案的結構
Schema檔案和其它XML檔案的樣子非常相似,它是由一組元素構成的,其根元素是「Schema」。 「Schema」元素是XML Schema中第一個出現的元素,用於表明該XML文檔是一個Schema文檔,相應的,「Schema」的結束標記一般在文檔的末尾。這樣,一個Schema的結構如下:

 
登入後複製

Schema有兩個屬性:name指定該Schema的名稱,而xmlns則指定該Schema所包含的命名空間。注意,一個XML Schema文件中可以包含多個命名空間,例如下面的語句指定了三個命名空間:

登入後複製

第一個是xmlns="urn:schemas-microsoft-com:xml-data ",它指定本文檔是一個XML Schema文檔;第二個是xmlns:dt="urn:schemas-microsoft-com:datatypes",它定義了在本文檔中可以使用的資料類型;第三個是xmlns:myNS="http://www.xml_step_by_step.edu\ns.xml",它顯示下面可能會用到在myNS中定義的元素或屬性。
2.用Schema定義元素及其內容
在講述Schema中和ETD定義相對應的種種定義方法之前,我們先來看看所涉及的三個Schema元素:ElementType 、element、group。
1.ElementType元素
在Schema文件中使用ElementType來宣告XML檔案中會出現的元素,ElementType的語法表達如下:

登入後複製

#在ElementType的幾個屬性中,name的意思不言而喻,是所聲明元素的名稱,它是不可缺少的。content是ElementType的重要屬性,它指明ElementType所宣告的元素是否為空、是否包含文字、是否包含子元素、或既包含文字又包含子元素。dt:type指定該元素的資料型態。order指定該元素的子元素的排列順序規則。最後,model指定該元素是否可以包含未在本Schema中定義的元素和屬性,它主要用於其它Schema的引入,也就是其它「命名空間」的引入。 「命名空間」的概念大家可能還比較生疏,現在你只要了解,在一個XML檔中能夠同時使用幾個不同的DTD或Schema定義。
下表列出了model可能的取值:

#取值

釋 意

open #表示該元素可以包含其它未在XML Schema中定義的元素和屬性
#closed 表示該元素只能包含在本XML Schema中定義過的元素和屬性

缺省状态下,XML Schema的model取值"open",也就是说,该元素可以包含其它未在XML Schema中定义的元素和属性。但是,这并不意味着任何元素和属性都可在Schema中出现,允许出现的前提是这些"异类"元素和属性必须在单独的XML Schema中加以定义,并且必须在引用的它们的元素中以命名空间形式指定其出处。
2.element元素
ElementType只是起到声明元素的作用,至于元素的内容究竟是什么,则要靠它的子元素element来说明。element的语法表达如下:

登入後複製

element实际上是对该Schema中ElementType声明的引用,而具体引用什么元素类型,就要靠type属性指定了。type属性不可缺少,并且为了保证type指定的是已经声明过的元素,要求它的取值必须同某个ElementType中的name属性严格一致。至于其它两个属性倒是可有可无。minOccurs指定该元素在其父元素中出现的最小次数,缺省值为1,表明该元素至少出现一次;也可以取值为0,表明该元素是可选的,可以不出现。maxOccurs则指定了该元素出现的最大次数,缺省值同样为1,表明该元素至多出现一次;也可取值为“*”,表明该元素在XML实例文档中出现次数不受限制。

3.group元素
DTD中有成组的概念,相应的,Schema中也有“group”元素。它的语法表达类似element元素:

登入後複製

Schema驗證XML概念的實例程式碼詳解<AttributeType和DTD的规定相同,组里的内容可以是元素,也可以是另一个子组。属性order指定该组中的元素或子组的顺序,minOccursmaxOccurs分别指定了该组在其父元素中出现的最小次数和最大次数。

4.用Schema定义元素属性
Schema中用来定义属性的元素有两个,AttributeType元素是声明属性的,attribute元素则是说明一个元素中究竟包含那些属性。
AttributeType元素
AttributeType元素也是Schema中的重要元素之一,用于定义该Schema文档中出现的属性类型。AttributeType的语法表达如下:

name="属性名" dt:type="属性类型" dt:values="枚举值列表" default="缺省值" required="{yes | no}" >
登入後複製
  1. name
    name不言而喻,自然是所声明的属性类型的名称。注意,该属性是必须的。

  2. dt:type
    dt:type指定所声明属性的数据类型,它除了支持DTD中包含的全部十大数据类型外,还支持一些扩展属性。Schema中的十个基本属性与DTD中属性的对应关系请见下表:

Schema中基本类型 DTD中数据类型
string #PCDATA
enumeration ENUMERATED
id ID
idref IDREF
idrefs IDREFS
nmtoken NMTOKEN
nmtokens NMTOKENS
entity ENTITY
entities EMTITIES
notation NOTATION

3.dt:value
dt:value只有當dt:type取值"enumeration"時才有效,此時,dt:value需列出所有可能的值。

4.default
default指定該屬性類型的預設值值。 default取值必須是有效的,例如,當dt:type取值"enumeration"時,default的取值必須來自dt:value所列的值。

5.required
required指定屬性對於引用它的元素是否是必須的。取值yes表示是必須的,取值no則表示並非必須。

6.attribute元素
AttributeType和attribute的關係與ElementType和element的關係相同,AttributeType只是起到聲明屬性的作用,而真正指明一個元素具有哪些屬性還需依靠attribute元素。

以上是Schema驗證XML概念的實例程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!