- 相關(guān)推薦
XML認證元素類型聲明
一個Dtd不僅要告訴語法分析器它所關(guān)聯(lián)的XML文件的根元素是什么,而且還要告訴語法分析器文件的內(nèi)容和結(jié)構(gòu),說清文件結(jié)構(gòu)中的每一個細節(jié)。為了定義這些細節(jié),我們必須展開Dtd中元素說明部分,使用元素類型聲明(Etd)來聲明所有有效的文件元素。
Etd不但說明了每個文件中可能存在的元素,給出了元素的名字,而且給出了元素的具體類型。一個XML元素可以為空,也可以是一段純文本,還可以有若干個子元素,而這些子元素同時又可以有它們的子元素。Dtd正是通過元素之間的父子關(guān)系,描述了整個文件的結(jié)構(gòu)關(guān)系。
Etd應(yīng)該采用如下的結(jié)構(gòu):
因此,在前面的例子里,可以在文件序言中通過如下方式定義“聯(lián)系人列表”這個元素:
]>
<聯(lián)系人列表>
...
這個Dtd定義了一個XML文件,它只有一個根元素,名為“聯(lián)系人列表”,這個元素可以有任何類型的子元素,也可以是純文本,還可以為空。
但是需要注意,盡管元素“聯(lián)系人列表”被定義為“可以”包含其它元素,但實際上這個 Dtd除了“聯(lián)系人列表”元素本身外沒有定義任何其它元素,所以也就沒有其它元素可以用作“聯(lián)系人列表”的子元素。“有效的”XML文件規(guī)定文件中所使用的任何元素都必須在Dtd中給出定義。
在“ANY”定義下使用任何純文本都是無須另加說明的,這一點與元素不同。故而,在相同的Dtd定義下,下面一段XML文件則是合法的:
]>
<聯(lián)系人列表>
純文本信息說明聯(lián)系人信息
元素類型聲明2
為了使元素“聯(lián)系人列表”中還可以包含其它元素,從而使前面的那個文件是“有效 的”,我們還需要定義元素“聯(lián)系人”和“姓名”。
]>
<聯(lián)系人列表>
<聯(lián)系人>
<姓名>張三
現(xiàn)在我們已經(jīng)定義了一個XML文件,它的根元素名為“聯(lián)系人列表”。“聯(lián)系人列表” 中可以包含任何純文本數(shù)據(jù),也可以含有子元素(這即是ANY的含義)。根據(jù)后面的定義,我們知道,“聯(lián)系人列表”中可以包含子元素“聯(lián)系人”,也可以直接包含子元素“姓名”;“聯(lián)系人”元素又可以包含自己的子元素,名為“姓名”;而“姓名”則只能包含純文本數(shù)據(jù)(即(#PCDATA))。
注意:
除了根元素外,在定義其它元素時使用關(guān)鍵字ANY都是不好的習慣。
在定義元素時,Etd的順序是無關(guān)緊要的。
還有一點要注意,不能對不同的元素使用相同的元素名,即便這些元素的內(nèi)容、包含的子元素不同也不行,因為它只會引起文件各個元素的混淆,使文件的可讀性大打折扣。
元素名的第一個字母必須是字母、或下劃線(_)、或冒號(:),后跟字母、數(shù)字、句號(.)、冒號、下劃線、連結(jié)號(-)的組合,并且不能包含空白符,不能以 “xml”開頭。盡管XML1.0標準允許使用任何長度的文件名,但是實際的XML處理器常常會限制標記名的長度。
定義元素及其子元素
對于以下的例子:
]>
<聯(lián)系人列表>
<聯(lián)系人>
<姓名>張三
準確的說法是,元素“聯(lián)系人”必須包含一個,且只能包含一個子元素“姓名”。可如果子元素是“EMAIL地址”怎么辦?聯(lián)系人可能根本沒有自己的EMAIL郵箱,也可能有好幾個EMAIL帳號。
使用正則表達式,我們就可以解決上述問題,描述父元素與子元素之間非常復雜的關(guān)系。例如,你可以對一個元素作如下任何一種類型的定義:它有一個子元素,有一個或多個子元素,有零個或多個子元素,至少有一個子元素。你還可以定義復合關(guān)系,比如“元素X是有效的,如果它含有一個或多個子元素Y,或一個子元素Z”。
元素定義是由它們的元素內(nèi)容模型(ECM)來描述的,也就是說,是由緊跟元素后面的括號中的內(nèi)容來定義的。因此,正如我們前面見到的,元素“聯(lián)系人”的ECM被描述為子元素“姓名”:
ECM中的內(nèi)容采取一組正則表達式的形式。在下表中,我們列出了正則表達式中可能出現(xiàn)的元字符:
元字符 含義
+ 出現(xiàn)一次或多次
* 出現(xiàn)零次或多次
? 可選,不出現(xiàn)或出現(xiàn)一次
() 一組要共同匹配的表達式
| OR,或,AND 要求嚴格遵從順序要求
下面幾節(jié)中,我們將通過一些例子具體講解這些元字符的用法,對使用正則表達式來定義ECM的方法獲得一些感性認識。
有順序的子元素
一個元素的各個子元素之間可以以任意順序出現(xiàn),也可以強制遵循一定的順序。
考慮下面的Dtd定義:
遵從這個Dtd的XML文件可以為:
<聯(lián)系人>
<姓名>張三
zhang@aaa.com
同樣,下面這個XML文件也是有效的:
<聯(lián)系人>
zhang@aaa.com
<姓名>張三
由于我們在Dtd定義中僅僅用空白符分隔了元素“聯(lián)系人”的兩個子元素,這說明我們并沒有嚴格要求兩個元素出現(xiàn)的順序,因此上面兩種寫法都是允許的。如果我們使用逗號“,”來分隔兩個子元素,那么XML文件中,元素“姓名”就必須出現(xiàn)在元素“EMAIL”前面。
重復元素
讓我們再把上節(jié)的例子作一個小小的改動:
讓我們看看前面給出的正則表達式的元字符集列表,它說明一個“聯(lián)系人”元素中必須含有一個“姓名”元素,后面接一個或多個“EMAIL”元素。這樣,下面的這段XML 文件是“有效的”。
<聯(lián)系人>
<姓名>張三
zhang@aaa.com
zhang@hotmail.com
zhang@yahoo.com
那么下面這段XML文件不是有效的,因為它沒有“EMAIL”元素,而“+”代表了“一個或多個”。
<聯(lián)系人>
<姓名>張三
如果你需要表示“零個或多個”,那么應(yīng)該使用字符“*”。例如:
成組元素
子元素可以使用括號并為一組。因此,下面的Dtd片段說明,一個“聯(lián)系人”元素中可以有一個或多個“姓名/EMAIL”子元素對,并且在每個子元素對中,“姓名”都放在“EMAIL”之前。
符合這個Dtd的XML文件可以是:
<聯(lián)系人>
<姓名>張三
zhang@aaa.com
<姓名>李四
li@bbb.org
<姓名>王五
wang@ccc.org
注意,僅僅是因為“+”由括號里面移到括號外面,元素“聯(lián)系人”的內(nèi)容就大大不同了。
OR或
號“|”描述了一個OR操作。因此,下面的Dtd片段所規(guī)定的XML元素是:所有的 “聯(lián)系人”元素應(yīng)該有一個“姓名”子元素,同時,在此之后還應(yīng)該有一個“電話”或一個“EMAIL”元素,但不能同時有“電話”和“EMAIL”兩個元素。
一個符合上述Dtd定義的“有效的”XML文件的定義應(yīng)該是:
<聯(lián)系人>
<姓名>張三
<電話>12345678
或者是:
<聯(lián)系人>
<姓名>張三
zhang@yahoo.com
注意:在一個組中,只允許使用一種連接符(例如“,”或“|”)。因此,象下面這樣定義的Dtd是不合法的:
要想使用多種連接符,只有通過創(chuàng)建子組的方式,使用
可選子元素
字符“?”說明一個子元素是可選的,它可以出現(xiàn),也可以不出現(xiàn)。因此,在下面的Dtd 中,我們規(guī)定,每一個“聯(lián)系人”都必須有一個“姓名”子元素,同時或者有一個“電話” 子元素,或者有一個“EMAIL”子元素,此外,它還可以包含一個“地址”子元素,也可以不包含這種元素。
根據(jù)這個Dtd描述,下面的XML片段是“有效的”:
<聯(lián)系人>
<姓名>張三
zhang@aaa.com
<地址>
<街道>五街1234號
<城市>北京市
<省份>北京
同樣,下面這段不包含“地址”元素的XML片段也是“有效的”:
<聯(lián)系人>
<姓名>張三
zhang@aaa.com
混合內(nèi)容&空元素
當然,可能也有一些時候,你在一個元素中既希望包含子元素,也希望包含純文本。 XML中允許這種使用方法,并把這種元素稱為混合內(nèi)容的元素。在下面的例子中, “聯(lián)系人”就是一個混合元素。
]>
<聯(lián)系人列表>
<聯(lián)系人>
<姓名>張三
<電話>(010)62345678
zhang@aaa.com
這是關(guān)于張三的信息
注意,由于在“(姓名|電話|EMAIL|#PCDATA)”之外有“*”,所以在元素“聯(lián)系人”中可以包含零個或多個“姓名”、電話、EMAIL和純文本字段。
還有一種情況沒有說,那就是,一個元素中不包含任何子元素,也不包含純文本。對于這種情況,我們可以定義一個空標記。當然,定義這樣一個標記很簡單,你只需要使用關(guān)鍵字EMPTY就可以了,例如: 這樣,在你的XML文件中,就可以使用一個空元素。
定義有效的元素屬性
現(xiàn)在我們已經(jīng)學會如何定義一個元素以及它的內(nèi)容,如何描述父元素與子元素之間錯綜復雜的關(guān)系,只差不知道如何定義元素的屬性了。
在第二篇教程中我們曾經(jīng)提到過屬性,那個例子是一個有關(guān)“商品”的元素,它有兩個屬性,即“類型”和“顏色”:<商品 類型 = "服裝" 顏色 = "黃色">
在Dtd中定義屬性時,我們使用下面的格式:
元素名是屬性所屬的元素的名字,在上面例子中,元素名是“商品”;屬性名是屬性的命名,例子中,“類型”和“顏色”是屬性名;缺省值說明在XML文件中,如果沒有特別說明屬性的取值,語法分析器默認它具有的取值;屬性類型則用來指定該屬性是屬于十個有效屬性類型中的哪種類型。
注意:由于ATTLIST是一個屬性的列表,它可以包含很多屬性,在實際應(yīng)用中,一個元素也經(jīng)常有多個屬性。
上面例子中的屬性可以如下定義:
類型 CDATA #REQUIRED
顏色 CDATA #IMPLIED
>
在元素說明的四個部分中,我們需要再詳細討論一下元素類型和缺省值。在下一節(jié)中,我們就從缺省值說起。
屬性缺省值
根據(jù)XML文件是否必須為一個屬性提供取值,屬性的缺省值又可以分為以下三類:
必須賦值的屬性
關(guān)鍵字REQUIRED說明XML文件中必須為這個屬性給出一個屬性值。例如,假設(shè)你想定義一個"頁面作者"元素,并把這個元素加入所有網(wǎng)站中的每一個頁面。之所以定義這個元素,是為了頁面編輯者能夠提供他的聯(lián)系信息,以便當發(fā)現(xiàn)頁面錯誤或無效鏈接時,可以及時地通知他。在這種情況下,每個頁面作者都有不同的個人信息,所以你無法事先知道應(yīng)該用什么作為缺省值,但你又的確需要提供每個人的信息。這時候,你就可以把與聯(lián)系信息相關(guān)的屬性定義為必須的(REQUIRED),而且不用提供缺省值。
屬性值可有可無的屬性
當使用IMPLIED關(guān)鍵字時,文法解釋器不再強行要求你在XML文件中給該屬性賦值,而且也無須在Dtd中為該屬性提供缺省值?梢哉f,這是對屬性值有無的最低要求,現(xiàn)實中經(jīng)常用到。
固定取值的屬性
還有一種特殊情況,你需要為一個特定的屬性提供一個缺省值,并且不希望XML 文件的編寫者把你的缺省值替代掉。這時候,就應(yīng)該使用FIXED關(guān)鍵字,同時為該屬性提供一個缺省值。
定義缺省值的屬性
如果不使用上面任何一種關(guān)鍵字的話,該種屬性就是屬于這種類型。對于這種屬性,你需要在Dtd中為它提供一個缺省值。而在XML文件中可以為該屬性給出新的屬性值來覆蓋事先定義的缺省值,也可以不另外給出屬性值,后一種情況下它就默認為采用Dtd中給出的缺省值。
至于究竟采用哪種缺省值,就看實際需要了。下面給出一個具體的例子:
姓名 #CDATA #IMPLIED
年齡 #CDATA #IMPLIED
聯(lián)系信息 #CDATA #REQUIRED
網(wǎng)站職務(wù) #CDATA #FIXED "頁面作者"
個人愛好 #CDATA "上網(wǎng)">
屬性類型
一個元素可以為以下十種類型中的任意一種:
CDATA
Enumerated
ID
IDREF
IDREFS
ENTITY
ENTITIES
NMTOKEN
NMTOKENS
NOTATION
下面我們就來一個一個講述。
CDATA類型
CDATA指的是純文本,即由字符、符號“&”、小于號“<”和引號“"”組成的字符串。當然,就象我們前面講到的,你應(yīng)該使用實體&代替“&”,<代替“<”, "代替“"”。
請看下面這個關(guān)于劇本的例子:
encoding="Gb2312"
standalone = "yes"?>
]>
<劇本>
<對話 演員="某甲">我可不這么認為!
<對話 演員="某乙">為什么呢?
【XML認證元素類型聲明】相關(guān)文章:
XML認證考試知識點:Parser06-07
Sun認證考試類型05-29
IBM認證系統(tǒng)啟動類型06-04
思科認證考試類型有哪些05-09
Adobe認證認證體系01-11
微軟認證考試最新認證01-13
思科認證考試認證體系06-17
IBM認證考試認證體系01-20