當前位置:學者齋 >

IT認證 >IBM認證 >

XML認證元素型別宣告

XML認證元素型別宣告

一個Dtd不僅要告訴語法分析器它所關聯的XML檔案的根元素是什麼,而且還要告訴語法分析器檔案的內容和結構,說清檔案結構中的每一個細節。為了定義這些細節,我們必須展開Dtd中元素說明部分,使用元素型別宣告(Etd)來宣告所有有效的檔案元素。

XML認證元素型別宣告

Etd不但說明了每個檔案中可能存在的元素,給出了元素的名字,而且給出了元素的具體型別。一個XML元素可以為空,也可以是一段純文字,還可以有若干個子元素,而這些子元素同時又可以有它們的子元素。Dtd正是通過元素之間的父子關係,描述了整個檔案的結構關係。

  Etd應該採用如下的結構:

因此,在前面的例子裡,可以在檔案序言中通過如下方式定義“聯絡人列表”這個元素:

]>

<聯絡人列表>

...

這個Dtd定義了一個XML檔案,它只有一個根元素,名為“聯絡人列表”,這個元素可以有任何型別的子元素,也可以是純文字,還可以為空。

但是需要注意,儘管元素“聯絡人列表”被定義為“可以”包含其它元素,但實際上這個 Dtd除了“聯絡人列表”元素本身外沒有定義任何其它元素,所以也就沒有其它元素可以用作“聯絡人列表”的子元素。“有效的”XML檔案規定檔案中所使用的任何元素都必須在Dtd中給出定義。

在“ANY”定義下使用任何純文字都是無須另加說明的,這一點與元素不同。故而,在相同的Dtd定義下,下面一段XML檔案則是合法的:

]>

<聯絡人列表>

純文字資訊說明聯絡人資訊

  元素型別宣告2

為了使元素“聯絡人列表”中還可以包含其它元素,從而使前面的那個檔案是“有效 的”,我們還需要定義元素“聯絡人”和“姓名”。

]>

<聯絡人列表>

<聯絡人>

<姓名>張三

現在我們已經定義了一個XML檔案,它的根元素名為“聯絡人列表”。“聯絡人列表” 中可以包含任何純文字資料,也可以含有子元素(這即是ANY的含義)。根據後面的定義,我們知道,“聯絡人列表”中可以包含子元素“聯絡人”,也可以直接包含子元素“姓名”;“聯絡人”元素又可以包含自己的子元素,名為“姓名”;而“姓名”則只能包含純文字資料(即(#PCDATA))。

注意:

除了根元素外,在定義其它元素時使用關鍵字ANY都是不好的習慣。

在定義元素時,Etd的順序是無關緊要的。

還有一點要注意,不能對不同的元素使用相同的元素名,即便這些元素的內容、包含的子元素不同也不行,因為它只會引起檔案各個元素的混淆,使檔案的可讀性大打折扣。

元素名的第一個字母必須是字母、或下劃線(_)、或冒號(:),後跟字母、數字、句號(.)、冒號、下劃線、連結號(-)的組合,並且不能包含空白符,不能以 “xml”開頭。儘管XML1.0標準允許使用任何長度的檔名,但是實際的XML處理器常常會限制標記名的長度。

定義元素及其子元素

對於以下的例子:

]>

<聯絡人列表>

<聯絡人>

<姓名>張三

準確的說法是,元素“聯絡人”必須包含一個,且只能包含一個子元素“姓名”。可如果子元素是“EMAIL地址”怎麼辦?聯絡人可能根本沒有自己的EMAIL郵箱,也可能有好幾個EMAIL帳號。

使用正則表示式,我們就可以解決上述問題,描述父元素與子元素之間非常複雜的關係。例如,你可以對一個元素作如下任何一種型別的定義:它有一個子元素,有一個或多個子元素,有零個或多個子元素,至少有一個子元素。你還可以定義複合關係,比如“元素X是有效的,如果它含有一個或多個子元素Y,或一個子元素Z”。

元素定義是由它們的元素內容模型(ECM)來描述的,也就是說,是由緊跟元素後面的括號中的內容來定義的。因此,正如我們前面見到的,元素“聯絡人”的ECM被描述為子元素“姓名”:

ECM中的內容採取一組正則表示式的形式。在下表中,我們列出了正則表示式中可能出現的元字元:

元字元 含義

+ 出現一次或多次

* 出現零次或多次

? 可選,不出現或出現一次

() 一組要共同匹配的表示式

| OR,或,AND 要求嚴格遵從順序要求

下面幾節中,我們將通過一些例子具體講解這些元字元的用法,對使用正則表示式來定義ECM的方法獲得一些感性認識。

有順序的子元素

一個元素的各個子元素之間可以以任意順序出現,也可以強制遵循一定的`順序。

考慮下面的Dtd定義:

遵從這個Dtd的XML檔案可以為:

<聯絡人>

<姓名>張三

同樣,下面這個XML檔案也是有效的:

<聯絡人>

<姓名>張三

由於我們在Dtd定義中僅僅用空白符分隔了元素“聯絡人”的兩個子元素,這說明我們並沒有嚴格要求兩個元素出現的順序,因此上面兩種寫法都是允許的。如果我們使用逗號“,”來分隔兩個子元素,那麼XML檔案中,元素“姓名”就必須出現在元素“EMAIL”前面。

  重複元素

讓我們再把上節的例子作一個小小的改動:

讓我們看看前面給出的正則表示式的元字符集列表,它說明一個“聯絡人”元素中必須含有一個“姓名”元素,後面接一個或多個“EMAIL”元素。這樣,下面的這段XML 檔案是“有效的”。

<聯絡人>

<姓名>張三

那麼下面這段XML檔案不是有效的,因為它沒有“EMAIL”元素,而“+”代表了“一個或多個”。

<聯絡人>

<姓名>張三

如果你需要表示“零個或多個”,那麼應該使用字元“*”。例如:

  成組元素

子元素可以使用括號併為一組。因此,下面的Dtd片段說明,一個“聯絡人”元素中可以有一個或多個“姓名/EMAIL”子元素對,並且在每個子元素對中,“姓名”都放在“EMAIL”之前。

符合這個Dtd的XML檔案可以是:

<聯絡人>

<姓名>張三

<姓名>李四

<姓名>王五

注意,僅僅是因為“+”由括號裡面移到括號外面,元素“聯絡人”的內容就大大不同了。

OR或

號“|”描述了一個OR操作。因此,下面的Dtd片段所規定的XML元素是:所有的 “聯絡人”元素應該有一個“姓名”子元素,同時,在此之後還應該有一個“電話”或一個“EMAIL”元素,但不能同時有“電話”和“EMAIL”兩個元素。

一個符合上述Dtd定義的“有效的”XML檔案的定義應該是:

<聯絡人>

<姓名>張三

<電話>12345678

或者是:

<聯絡人>

<姓名>張三

注意:在一個組中,只允許使用一種連線符(例如“,”或“|”)。因此,象下面這樣定義的Dtd是不合法的:

要想使用多種連線符,只有通過建立子組的方式,使用

  可選子元素

字元“?”說明一個子元素是可選的,它可以出現,也可以不出現。因此,在下面的Dtd 中,我們規定,每一個“聯絡人”都必須有一個“姓名”子元素,同時或者有一個“電話” 子元素,或者有一個“EMAIL”子元素,此外,它還可以包含一個“地址”子元素,也可以不包含這種元素。

根據這個Dtd描述,下面的XML片段是“有效的”:

<聯絡人>

<姓名>張三

<地址>

<街道>五街1234號

<城市>北京市

<省份>北京

同樣,下面這段不包含“地址”元素的XML片段也是“有效的”:

<聯絡人>

<姓名>張三

  混合內容&空元素

當然,可能也有一些時候,你在一個元素中既希望包含子元素,也希望包含純文字。 XML中允許這種使用方法,並把這種元素稱為混合內容的元素。在下面的例子中, “聯絡人”就是一個混合元素。

]>

<聯絡人列表>

<聯絡人>

<姓名>張三

<電話>(010)62345678

這是關於張三的資訊

注意,由於在“(姓名|電話|EMAIL|#PCDATA)”之外有“*”,所以在元素“聯絡人”中可以包含零個或多個“姓名”、電話、EMAIL和純文字欄位。

還有一種情況沒有說,那就是,一個元素中不包含任何子元素,也不包含純文字。對於這種情況,我們可以定義一個空標記。當然,定義這樣一個標記很簡單,你只需要使用關鍵字EMPTY就可以了,例如: 這樣,在你的XML檔案中,就可以使用一個空元素。

定義有效的元素屬性

現在我們已經學會如何定義一個元素以及它的內容,如何描述父元素與子元素之間錯綜複雜的關係,只差不知道如何定義元素的屬性了。

在第二篇教程中我們曾經提到過屬性,那個例子是一個有關“商品”的元素,它有兩個屬性,即“型別”和“顏色”:<商品 型別 = "服裝" 顏色 = "黃色">

在Dtd中定義屬性時,我們使用下面的格式:

元素名是屬性所屬的元素的名字,在上面例子中,元素名是“商品”;屬性名是屬性的命名,例子中,“型別”和“顏色”是屬性名;預設值說明在XML檔案中,如果沒有特別說明屬性的取值,語法分析器預設它具有的取值;屬性型別則用來指定該屬性是屬於十個有效屬性型別中的哪種型別。

注意:由於ATTLIST是一個屬性的列表,它可以包含很多屬性,在實際應用中,一個元素也經常有多個屬性。

上面例子中的屬性可以如下定義:

型別 CDATA #REQUIRED

顏色 CDATA #IMPLIED

>

在元素說明的四個部分中,我們需要再詳細討論一下元素型別和預設值。在下一節中,我們就從預設值說起。

屬性預設值

根據XML檔案是否必須為一個屬性提供取值,屬性的預設值又可以分為以下三類:

必須賦值的屬性

關鍵字REQUIRED說明XML檔案中必須為這個屬性給出一個屬性值。例如,假設你想定義一個"頁面作者"元素,並把這個元素加入所有網站中的每一個頁面。之所以定義這個元素,是為了頁面編輯者能夠提供他的聯絡資訊,以便當發現頁面錯誤或無效連結時,可以及時地通知他。在這種情況下,每個頁面作者都有不同的個人資訊,所以你無法事先知道應該用什麼作為預設值,但你又的確需要提供每個人的資訊。這時候,你就可以把與聯絡資訊相關的屬性定義為必須的(REQUIRED),而且不用提供預設值。

屬性值可有可無的屬性

當使用IMPLIED關鍵字時,文法直譯器不再強行要求你在XML檔案中給該屬性賦值,而且也無須在Dtd中為該屬性提供預設值。可以說,這是對屬性值有無的最低要求,現實中經常用到。

固定取值的屬性

還有一種特殊情況,你需要為一個特定的屬性提供一個預設值,並且不希望XML 檔案的編寫者把你的預設值替代掉。這時候,就應該使用FIXED關鍵字,同時為該屬性提供一個預設值。

定義預設值的屬性

如果不使用上面任何一種關鍵字的話,該種屬性就是屬於這種型別。對於這種屬性,你需要在Dtd中為它提供一個預設值。而在XML檔案中可以為該屬性給出新的屬性值來覆蓋事先定義的預設值,也可以不另外給出屬性值,後一種情況下它就預設為採用Dtd中給出的預設值。

至於究竟採用哪種預設值,就看實際需要了。下面給出一個具體的例子:

姓名 #CDATA #IMPLIED

年齡 #CDATA #IMPLIED

聯絡資訊 #CDATA #REQUIRED

網站職務 #CDATA #FIXED "頁面作者"

個人愛好 #CDATA "上網">

  屬性型別

一個元素可以為以下十種型別中的任意一種:

CDATA

Enumerated

ID

IDREF

IDREFS

ENTITY

ENTITIES

NMTOKEN

NMTOKENS

NOTATION

下面我們就來一個一個講述。

CDATA型別

CDATA指的是純文字,即由字元、符號“&”、小於號“<”和引號“"”組成的字串。當然,就象我們前面講到的,你應該使用實體&代替“&”,<代替“<”, "代替“"”。

請看下面這個關於劇本的例子:

encoding="Gb2312"

standalone = "yes"?>

]>

<劇本>

<對話 演員="某甲">我可不這麼認為!

<對話 演員="某乙">為什麼呢?


標籤: XML 元素 宣告
  • 文章版權屬於文章作者所有,轉載請註明 https://xuezhezhai.com/zh-tw/itrz/ibm/joro6.html