1. <tt id="5hhch"><source id="5hhch"></source></tt>
    1. <xmp id="5hhch"></xmp>

  2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

    <rp id="5hhch"></rp>
        <dfn id="5hhch"></dfn>

      1. XML認證教程:Dtd

        時間:2024-08-15 09:07:28 IBM認證 我要投稿
        • 相關推薦

        XML認證教程:Dtd

          一個“有效的”文件首先應該是“形式良好”的。但這還遠遠不夠,它還要往前更進一 步。一個XML文件必須遵守文件類型描述Dtd(Document Type Definition)中 定義的種種規定。所有的文件都是由序言和文件體構成的。序言中包含了XML聲明, 在序言中還可以包含Dtd定義。

          最簡單的使用Dtd的方法是在XML文件的序言部分加入一個Dtd描述,加入的位置是 緊接在XML處理指示之后。一個包含Dtd的XML文件的結構為:

          元素描述

          ]>

          文件體.......

          這樣,我們就定義了一個文件,它以DOCTYPE中規定的根元素名作為其根元素的名字。

          如果為每一個XML文件加入一段Dtd定義,是相當繁瑣的。而且,更多的情況下,我們 會為一批XML文件定義一個相同的Dtd。例如,對于報社中的每篇稿件,它們都有相同 的格式,可以采用一個統一的Dtd,為每一篇單獨定義既麻煩,又不利于統一格式。 好在XML規范為我們提供了解決這個問題的方法,它就是外部Dtd。

          v

          外部Dtd的好處是:它可以方便高效地被多個XML文件所共享。你只要寫一個Dtd 文件,就可以被多個XML文件所引用。事實上,當許多組織需要統一它們的數據交 換格式時,它們就是通過外部Dtd來完成的。這樣做不僅簡化了輸入工作,還保證 當你需要對Dtd做出改動時,不用一一去改每個引用了它的XML文件,只要改一個 公用的Dtd文件就足夠了。

          為了引用一個外部Dtd,必須修改XML聲明和DOCTYPE聲明。

          XML聲明中必須說明這個文件不是自成一體的,即standalone屬性的屬性值不再是yes了:

          在DOCTYPE聲明中,應該加入SYSTEM屬性:

          例如:

          上面的URL是一個絕對路徑,除此以外,它還可以是一個相對路徑,如: 它說明這個Dtd文件和引用它的XML文件在同一個目錄下。

          使用這種方法,你可以方便地把Dtd文件從你的XML文件中分離出來,粘貼到另一 個文件fclml.dtd中。這樣,你就得到一個Dtd文件和一個有效的XML文件。

          公用Dtd

          使用外部Dtd時,要在DOCTYPE中使用關鍵字SYSTEM。實際上,SYSTEM不是引 用外部Dtd的唯一方法,這個關鍵字主要用于引用一個作者或組織所編寫的眾多 XML文件中通用的Dtd。還存在一種外部Dtd,它是一個由權威機構制訂的,提供 給特定行業或公眾使用的Dtd。因此,另一個引用外部Dtd的辦法是使用關鍵字 PUbLIC,引用這一類公開給公眾使用的Dtd。

          當使用關鍵字PUbLIC進行引用時,這個外部Dtd還需要得到一個標識名。引用公 共Dtd的形式為:

          請見下面例子:

          這個Dtd標識的命名規則和XML文件的命名規則稍有不同。具體地說,Dtd名稱只能 包含字母、數字、空格和下面的符號:_%$#@()+:=/!*;?。同時,Dtd名稱還必須 符合一些標準的規定。例如,ISO標準的Dtd以“ISO”三個字母開頭;被改進的非ISO 標準的Dtd以加號“+”開頭;未被改進的非ISO標準的Dtd以減號“-”開頭。

          無論是哪一種情況,開始部分后面都跟著兩個斜杠“//”及Dtd所有者的名稱。在這個 名稱之后又是兩個斜杠“//”,再然后是Dtd所描述的文件的類型。最后,在又一對斜 杠之后是語言的種類(參見ISO 639)。例如下面這個公用Dtd的引用:

          "http://www.mydomain.com/dtds/fclml.dtd">

          看上去的確比較復雜,不過沒關系,對于Dtd的命名通常不是它的引用者的任務,XML 文件的編寫者只要在自己的文件中把事先定義好的Dtd名稱放在相應的位置中就可以了。

          元素類型聲明1

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

          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文件可以為:

          <聯系人>

          <姓名>張三

          zhang@aaa.com

          同樣,下面這個XML文件也是有效的:

          <聯系人>

          zhang@aaa.com

          <姓名>張三

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

          重復元素

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

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

          <聯系人>

          <姓名>張三

          zhang@aaa.com

          zhang@hotmail.com

          zhang@yahoo.com

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

          <聯系人>

          <姓名>張三

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

          成組元素

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

          符合這個Dtd的XML文件可以是:

          <聯系人>

          <姓名>張三

          zhang@aaa.com

          <姓名>李四

          li@bbb.org

          <姓名>王五

          wang@ccc.org

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

          OR或

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

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

          <聯系人>

          <姓名>張三

          <電話>12345678

          或者是:

          <聯系人>

          <姓名>張三

          zhang@yahoo.com

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

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

          可選子元素

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

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

          <聯系人>

          <姓名>張三

          zhang@aaa.com

          <地址>

          <街道>五街1234號

          <城市>北京市

          <省份>北京

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

          <聯系人>

          <姓名>張三

          zhang@aaa.com

          混合內容&空元素

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

          ]>

          <聯系人列表>

          <聯系人>

          <姓名>張三

          <電話>(010)62345678

          zhang@aaa.com

          這是關于張三的信息

          注意,由于在“(姓名|電話|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文件中對屬性的賦值將從這個列表中選取一個值。這類屬性屬于枚舉類型ENUMERATED,不過,關鍵字ENUMERATED是不出現在Dtd定義中的。

          encoding="Gb2312"

          standalone = "yes"?>

          ]>

          <購物籃>

          <肉 類型 = "魚肉"/>

          <肉 類型 = "牛肉"/>

          <肉/>

          注意,在上面這個例子中,給屬性“類型”定義的缺省值是“雞肉”,所以“購物籃”中的第三個元素的“類型”屬性取值為“雞肉”。

          ID和IDREF

          ID類型

          ID是用屬性值的方式為文件中的某個元素定義唯一標識的方法,它的作用類似于 HTML文件中的內部鏈接。在大多數情況下,ID由處理文件的程序或腳本語言使用。

          ID的值必須是一個有效的XML名稱,它由字母、數字或下劃線開始,名字中不能出 現空白符。另外一般而言,不要給ID類型的屬性事先指定缺省值,這很容易引起不 同的元素具有相同的標識的情況,更不能使用FIXED型的缺省值。此類屬性經常使 用REQUIRED缺省類型,當然,這也不是必須的。有的應用并不要求每個元素都有 自己的標識,所以,也可以使用IMPLIED缺省類型。

          encoding="Gb2312"

          standalone = "yes"?>

          ]>

          <聯系人列表>

          <聯系人 編號="1">

          <姓名>張三

          zhang@aaa.com

          <聯系人 編號="2">

          <姓名>李四

          li@bbb.org

          ID和IDREF2

          IDREF類型

          IDREF類型允許一個元素的屬性使用文件中的另一個元素,方法就是把那個元素的 ID標識值作為該屬性的取值。例如下面的例子:

          encoding="Gb2312"

          standalone = "yes"?>

          ]>

          <聯系人列表>

          <聯系人 編號="2">

          <姓名>張三

          zhang@aaa.com

          <聯系人 編號="1" 上司="2">

          <姓名>李四

          li@aaa.com

          NMTOKEN和NMTOKENS

          類型NMTOKEN和NMTOKENS是諸多屬性類型中面向處理程序的又一個類型。這兩個 類型用于指示一個有效的名字。當需要把一個元素和其它的元件,例如一個JAVA 類或一個安全算法,相聯系時,可以讓它們助你一臂之力。請看下面的例子:

          關于元素的定義:

          安全性( ON | OFF ) "OFF"

          授權用戶 NMTOKENS #IMPLIED

          >

          XML文件:

          <數據 安全性="ON" 授權用戶 = "Iggieeb SelenaS Guntherb">

          blah blah blah

          NOTATION類型

          NOTATION類型允許屬性值為一個Dtd中聲明的符號,這個類型對于使用非XML格式的數據非常有用。

          現實世界中存在著很多無法或不易用XML格式組織的數據,例如圖象、聲音、影象等 等。對于這些數據,XML應用程序常常并不提供直接的應用支持。通過為它們設定 NOTATION類型的屬性,可以向應用程序指定一個外部的處理程序。例如,當你想要 為一個給定的文件類型指定一個演示設備時,可以用NOTATION類型的屬性作為觸發。

          要使用NOTATION類型作為屬性的類型,首先要在Dtd中為可選用的記號作出定義。 定義的方式有兩種,一種是使用MIME類型,形式是:

          再有一種是使用一個URL路徑,指定一個處理程序的路徑。

          在下面這個例子中,為"電影"元素指定了兩種可選設備:一種是movPlayer.exe,用來播映.mov文件,另一種則用來繪制GIF圖象。

          encoding="Gb2312"

          standalone = "yes"?>

          ]>

          <文件>

          <電影 演示設備 = "mp"/>

          實體屬性類型與參數實體

          實體在XML中充當著宏或別名的角色。實體最根本的作用是幫助你為一大段文本創 建一個別名,這樣,在文件的另一個位置需要引用這段文本時,僅需要指向它的別 名就可以了。它還意味著一旦需要修改,僅需要在一個地方作改動,就完成了全局 的改動。

          我們還提到,實體分為一般實體和參數實體兩種類型,它們都可以定義為內部的也 可以用關鍵字SYSTEM定義為外部的。實體的定義必須出現在引用之前,而且要注意 正確嵌套,不能出現循環引用的情況。在Dtd中,這兩種類型的實體都得到了廣泛的 應用。

          實體屬性類型

          實體類型的屬性值屬于一般實體,如前所述,它的定義方式是:

          或利用SYSTEM定義外部實體,方式為:

          引用方式為: &實體名;

          使用關鍵字ENTITY,則聲明一個屬性是實體類型,它的取值為已定義的實體。請看下面例子:

          encoding="Gb2312"

          standalone = "yes"?>

          ]>

          <文件>

          <電影 來源 = "&bladeRunner;">

          參數實體 參數實體專門用在Dtd中。定義方式是:

          或:

          引用方式為: %實體名; 使用參數實體,可以方便元素和屬性的聲明。例如:

          最后提醒大家注意,不要以為實體屬性類型的定義與Dtd有關,所以它使用的就是參數 實體。參數實體只能在Dtd中使用,而對于任何元素屬性值的指定(除了缺省值外), 都是在XML文件正文中進行的,因此實體屬性值仍屬于一般實體。

        【XML認證教程:Dtd】相關文章:

        IBM XML認證知識點:Dtd09-01

        XML入門教程10-22

        XML認證元素類型聲明05-28

        關于XML的入門教程10-06

        關于IBM XML認證考試的要點09-07

        XML名稱空間入門教程06-07

        MCSA認證教程詳解10-04

        XML認證考試知識點:Parser08-21

        關于XML入門教程:分析XM09-25

        關于XML的介紹08-29

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码

        1. <tt id="5hhch"><source id="5hhch"></source></tt>
          1. <xmp id="5hhch"></xmp>

        2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

          <rp id="5hhch"></rp>
              <dfn id="5hhch"></dfn>