您的位置:首页 > 其它

XML DTD简介

2006-11-04 17:19 218 查看
內部DTD
一個"""""""""""""""""""""""""""""""""""" 步。一個XML文件必須遵守文件類型描述DTD(Document Type Definition)中 定義的種種規定。所有的文件都是由序言和文件體構成的。序言中包含了XML聲明, 在序言中還可以包含DTD定義。
最簡單的使用DTD的方法是在XML文件的序言部分加入一個DTD描述,加入的位置是 緊接在XML處理指示之后。一個包含DTD的XML文件的架構為︰
<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<?DOCTYPE 根元素名[
元素描述
]>
文件體.......

這樣,我們就定義了一個文件,它以DOCTYPE中規定的根元素名作為其根元素的名字。
如果為每一個XML文件加入一段DTD定義,是相當繁瑣的。而且,更多的情況下,我們 會為一批XML文件定義一個相同的DTD。例如,對于報社中的每篇稿件,它們都有相同 的格式,可以採用一個統一的DTD,為每一篇單獨定義既麻煩,又不利于統一格式。 好在XML規範為我們提供了解決這個問題的方法,它就是外部DTD。
外部DTD
外部DTD的好處是︰它可以方便高效地被多個XML文件所共享。你只要寫一個DTD 文件,就可以被多個XML文件所引用。事實上,當許多組織需要統一它們的數據交 換格式時,它們就是透過外部DTD來完成的。這樣做不僅簡化了輸入工作,還保證 當你需要對DTD做出改動時,不用一一去改每個引用了它的XML文件,只要改一個 公用的DTD文件就足夠了。
為了引用一個外部DTD,必須修改XML聲明和DOCTYPE聲明。
XML聲明中必須說明這個文件不是自成一體的,即standalone屬性的屬性值不再是yes了︰
<?xml version = "1.0" encoding="GB2312" standalone = "no"?>
在DOCTYPE聲明中,應該加入SYSTEM屬性︰<!DOCTYPE 根元素名 SYSTEM "外部DTD文件的URL">
例如︰
<!DOCTYPE 聯繫人列表 SYSTEM "http://www.mydomain.com/dtds/fclml.dtd">
上面的URL是一個絕對路徑,除此以外,它還可以是一個相對路徑,如︰ <!DOCTYPE 聯繫人列表 SYSTEM "fclml.dtd"> 它說明這個DTD文件和引用它的XML文件在同一個目錄下。
使用這種方法,你可以方便地把DTD文件從你的XML文件中分離出來,粘貼到另一 個文件fclml.dtd中。這樣,你就得到一個DTD文件和一個有效的XML文件。
公用DTD
使用外部DTD時,要在DOCTYPE中使用關鍵字SYSTEM。實際上,SYSTEM不是引 用外部DTD的唯一方法,這個關鍵字主要用于引用一個作者或組織所編寫的眾多 XML文件中通用的DTD。還存在一種外部DTD,它是一個由威權機構製訂的,提供 給特定行業或公眾使用的DTD。因此,另一個引用外部DTD的辦法是使用關鍵字 PUBLIC,引用這一類公開給公眾使用的DTD。
當使用關鍵字PUBLIC進行引用時,這個外部DTD還需要得到一個標識名。引用公 共DTD的形式為︰ <!DOCTYPE 根元素 PUBLIC "DTD名稱" "外部DTD的URL">
請見下面例子︰
<!DOCTYPE 聯繫人列表 PUBLIC "聯繫人DTD" "http://www.mydomain.com/dtds/fclml.dtd">
這個DTD標識的命名規則和XML文件的命名規則稍有不同。具體地說,DTD名稱只能 包含字母、數字、空格和下面的符號︰_%$#@():=/!*;?。同時,DTD名稱還必須 符合一些標準的規定。例如,ISO標準的DTD"ISO"""""""""""""ISO 標準的DTD以加號"""""""""""ISO標準的DTD以減號"-""""
無論是哪一種情況,開始部分后面都跟著兩個斜杠"//""DTD所有者的名稱。在這個 名稱之后又是兩個斜杠"//""""""DTD所描述的文件的類型。最後,在又一對斜 杠之后是語言的種類(參見ISO 639)。例如下面這個公用DTD的引用︰
<!DOCTYPE 聯繫人列表 PUBLIC "-//Luna Dong//Contact Data//CN" "http://www.mydomain.com/dtds/fclml.dtd">
看上去的確比較複雜,不過沒關係,對于DTD的命名通常不是它的引用者的任務,XML 文件的編寫者只要在自己的文件中把事先定義好的DTD名稱放在相應的位置中就可以了。
元素類型聲明1
一個DTD不僅要告訴語法分析器它所關聯的XML文件的根元素是什麼,而且還要告 訴語法分析器文件的內容和架構,說清文件架構中的每一個細節。為了定義這些細 節,我們必須展開DTD中元素說明部分,使用元素類型聲明(ETD)來聲明所有有 效的文件元素。
ETD不但說明了每個文件中可能存在的元素,給出了元素的名字,而且給出了元素的 具體類型。一個XML元素可以為空,也可以是一段純文本,還可以有若干個子元素, 而這些子元素同時又可以有它們的子元素。DTD正是透過元素之間的父子關係,描述 了整個文件的架構關係。
ETD應該採用如下的架構︰ <!ELEMENT 元素名 元素內容描述>
因此,在前面的例子裡,可以在文件序言中透過如下模式定義""""""""""""
<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 聯繫人列表[
<!ELEMENT 聯繫人列表 ANY>
]>

<聯繫人列表>
...
</聯繫人列表>
這個DTD定義了一個XML文件,它只有一個根元素,名為"""""""""""""" 有任何類型的子元素,也可以是純文本,還可以為空。
但是需要注意,儘管元素"""""""""""""""""""""""""""" DTD除了"""""""""""""""""""""""""""""""""" 以用作"""""""""""""""""XML文件規定文件中所使用的任何元素都必 須在DTD中給出定義。
在"ANY"""""""""""""""""""""""""""""""""" 相同的DTD定義下,下面一段XML文件則是合法的︰
<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 聯繫人列表[
<!ELEMENT 聯繫人列表 ANY>
]>

<聯繫人列表>
純文本訊息說明聯繫人訊息
</聯繫人列表>
元素類型聲明2
為了使元素"""""""""""""""""""""""""""""""" 的""""""""""""""""""""""
<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 聯繫人列表[
<!ELEMENT 聯繫人列表 ANY>
<!ELEMENT 聯繫人(姓名)>
<!ELEMENT 姓名(#PCDATA)>
]>

<聯繫人列表>
<聯繫人>
<姓名>張三</姓名>
</聯繫人>
</聯繫人列表>
現下我們已經定義了一個XML文件,它的根元素名為""""""""""""""" 中可以包含任何純文本數據,也可以含有子元素(這即是ANY的含義)。根據后面的 定義,我們知道,"""""""""""""""""""""""""""""" 素""""""""""""""""""""""""""""""""""""""" 包含純文本數據(即(#PCDATA))。
注意︰

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

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

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

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

定義元素及其子元素
對于以下的例子︰
<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 聯繫人列表[
<!ELEMENT 聯繫人列表 ANY>
<!ELEMENT 聯繫人(姓名)>
<!ELEMENT 姓名(#PCDATA)>
]>

<聯繫人列表>
<聯繫人>
<姓名>張三</姓名>
</聯繫人>
</聯繫人列表>
準確的說法是,元素""""""""""""""""""""""""""""" 果子元素是"EMAIL位址"""""""""""""""""EMAIL郵箱,也可能 有好幾個EMAIL帳號。
使用正則表達式,我們就可以解決上述問題,描述父元素與子元素之間非常複雜的 關係。例如,你可以對一個元素作如下任何一種類型的定義︰它有一個子元素,有 一個或多個子元素,有零個或多個子元素,至少有一個子元素。你還可以定義複合 關係,比如"""X是有效的,如果它含有一個或多個子元素Y,或一個子元素Z""
元素定義是由它們的元素內容模型(ECM)來描述的,也就是說,是由緊跟元素后 面的括號中的內容來定義的。因此,正如我們前面見到的,元素""""""ECM被 描述為子元素""""" <!ELEMENT 聯繫人(姓名)>
ECM中的內容採取一組正則表達式的形式。在下表中,我們列出了正則表達式中可能出現的元字符︰
元字符
含義
+
出現一次或多次
*
出現零次或多次

可選,不出現或出現一次
()
一組要共同匹配的表達式
OR,或,AND
要求嚴格遵從順序要求
下面幾節中,我們將透過一些例子具體講解這些元字符的用法,對使用正則表達式 來定義ECM的方法獲得一些感性認識。
有順序的子元素
一個元素的各個子元素之間可以以任意順序出現,也可以強製遵循一定的順序。
考慮下面的DTD定義︰
<!ELEMENT 聯繫人(姓名 EMAIL)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
遵從這個DTD的XML文件可以為︰
<聯繫人>
<姓名>張三</姓名>
<EMAIL>zhang@aaa.com</EMAIL>
</聯繫人>
同樣,下面這個XML文件也是有效的︰
<聯繫人>
<EMAIL>zhang@aaa.com</EMAIL>
<姓名>張三</姓名>
</聯繫人>
由於我們在DTD定義中僅僅用空白符分隔了元素""""""""""""""" 我們並沒有嚴格要求兩個元素出現的順序,因此上面兩種寫法都是允許的。如果 我們使用逗號""""""""""""""XML文件中,元素""""""""" 在元素"EMAIL""""
重複元素
讓我們再把上節的例子作一個小小的改動︰
<!ELEMENT 聯繫人(姓名,EMAIL+)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
讓我們看看前面給出的正則表達式的元字符集列表,它說明一個""""""""" 須含有一個""""""""""""""""EMAIL""""""""""""XML 文件是""""""
<聯繫人>
<姓名>張三</姓名>
<EMAIL>zhang@aaa.com</EMAIL>
<EMAIL>zhang@hotmail.com</EMAIL>
<EMAIL>zhang@yahoo.com</EMAIL>
</聯繫人>
那么下面這段XML文件不是有效的,因為它沒有"EMAIL""""""+""""""" 或多個""
<聯繫人>
<姓名>張三</姓名>
</聯繫人>
如果你需要表示"""""""""""""""""*"""""
<!ELEMENT 聯繫人(姓名,EMAIL*)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
成組元素
子元素可以使用括號並為一組。因此,下面的DTD片段說明,一個""""""" 中可以有一個或多個"""/EMAIL"""""""""""""""""""""" 放在"EMAIL""""
<!ELEMENT 聯繫人(姓名,EMAIL)+>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
符合這個DTD的XML文件可以是︰
<聯繫人>
<姓名>張三</姓名>
<EMAIL>zhang@aaa.com</EMAIL>

<姓名>李四</姓名>
<EMAIL>li@bbb.org</EMAIL>

<姓名>王五</姓名>
<EMAIL>wang@ccc.org</EMAIL>
</聯繫人>
注意,僅僅是因為"+""""""""""""""""""""""""""""""
OR
號"|""""""OR操作。因此,下面的DTD片段所規定的XML元素是︰所有的 """""""""""""""""""""""""""""""""""""" 一個"EMAIL""""""""""""""""EMAIL""""""
<!ELEMENT 聯繫人(姓名,(電話|EMAIL))>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT 電話(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
一個符合上述DTD定義的"""""XML文件的定義應該是︰
<聯繫人>
<姓名>張三</姓名>
<電話>12345678</EMAIL>
</聯繫人>
或者是︰
<聯繫人>
<姓名>張三</姓名>
<EMAIL>zhang@yahoo.com</EMAIL>
</聯繫人>
注意︰在一個組中,只允許使用一種連接符(例如"""""|""""""""""""""DTD是不合法的︰<!ELEMENT 聯繫人(姓名,電話|EMAIL)>
要想使用多種連接符,只有透過創建子組的模式,使用<!ELEMENT 聯繫人(姓名,(電話|EMAIL))>
可選子元素
字符"?"""""""""""""""""""""""""""""""""DTD 中,我們規定,每一個"""""""""""""""""""""""""""""" 子元素,或者有一個"EMAIL"""""""""""""""""""""""""" 以不包含這種元素。
<!ELEMENT 聯繫人(姓名,(電話|EMAIL),位址?)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT 電話(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
<!ELEMENT 位址(街道,城市,省份)>
<!ELEMENT 街道 (#PCDATA)>
<!ELEMENT 城市 (#PCDATA)>
<!ELEMENT 省份 (#PCDATA)>
根據這個DTD描述,下面的XML片段是""""""
<聯繫人>
<姓名>張三</姓名>
<EMAIL>zhang@aaa.com</EMAIL>
<位址>
<街道>五街1234號</街道>
<城市>北京市</城市>
<省份>北京</省份>
</位址>
</聯繫人>
同樣,下面這段不包含"""""""XML片段也是""""""
<聯繫人>
<姓名>張三</姓名>
<EMAIL>zhang@aaa.com</EMAIL>
</聯繫人>
混合內容&空元素
當然,可能也有一些時候,你在一個元素中既希望包含子元素,也希望包含純文本。 XML中允許這種使用方法,並把這種元素稱為混合內容的元素。在下面的例子中, """"""""""""""
<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE CONTACTS [
<!ELEMENT 聯繫人列表 ANY>
<!ELEMENT 聯繫人(姓名|電話|EMAIL|#PCDATA)*>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT 電話(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
]>
<聯繫人列表>
<聯繫人>
<姓名>張三</姓名>
<電話>(010)62345678</電話>
<EMAIL>zhang@aaa.com</EMAIL>
這是關於張三的訊息
</聯繫人>
</聯繫人列表>
注意,由於在"(姓名|電話|EMAIL|#PCDATA)"""""*""""""""""""""""""""""""""""""EMAIL和純文本字段。
還有一種情況沒有說,那就是,一個元素中不包含任何子元素,也不包含純文本。對于這種情況,我們可以定義一個空標記。當然,定義這樣一個標記很簡 單,你只需 要使用關鍵字EMPTY就可以了,例如︰<!ELEMENT HR EMPTY> 這樣,在你的XML文件中,就可以使用一個空元素<HR/>。
定義有效的元素屬性
現下我們已經學會如何定義一個元素以及它的內容,如何描述父元素與子元素之間 錯綜複雜的關係,只差不知道如何定義元素的屬性了。
在第二篇教程中我們曾經提到過屬性,那個例子是一個有關""""""""""""""""""""""""""<商品 類型 = "服裝" 顏色 = "黃色">
在DTD中定義屬性時,我們使用下面的格式︰ <!ATTLIST 元素名 (屬性名 屬性類型 缺省值)*>
元素名是屬性所屬的元素的名字,在上面例子中,元素名是"""""""""""""""""""""""""""""""""""""""XML文 件中,如果沒有特別說明屬性的取值,語法分析器默認它具有的取值;屬性類型則用來指定該屬性是屬于十個有效屬性類型中的哪種類型。
注意︰由於ATTLIST是一個屬性的列表,它可以包含很多屬性,在實際應用中,一個元素也經常有多個屬性。
上面例子中的屬性可以如下定義︰
<!ATTLIST 商品
類型 CDATA #REQUIRED
顏色 CDATA #IMPLIED
>
在元素說明的四個部分中,我們需要再詳細討論一下元素類型和缺省值。在下一節中,我們就從缺省值說起。
屬性缺省值
根據XML文件是否必須為一個屬性提供取值,屬性的缺省值又可以分為以下三類︰

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

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

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

定義缺省值的屬性
如果不使用上面任何一種關鍵字的話,該種屬性就是屬于這種類型。對于這種屬 性,你需要在DTD中為它提供一個缺省值。而在XML文件中可以為該屬性給出新的 屬性值來覆蓋事先定義的缺省值,也可以不另外給出屬性值,后一種情況下它就 默認為採用DTD中給出的缺省值。

至於究竟採用哪種缺省值,就看實際需要了。下面給出一個具體的例子︰
<!ATTLIST 頁面作者
姓名 #CDATA #IMPLIED
年齡 #CDATA #IMPLIED
聯繫訊息 #CDATA #REQUIRED
網站職務 #CDATA #FIXED "頁面作者"
個人愛好 #CDATA "上網">
一個元素可以為以下十種類型中的任意一種︰
CDATA
Enumerated
ID
IDREF
IDREFS
ENTITY
ENTITIES
NMTOKEN
NMTOKENS
NOTATION
下面我們就來一個一個講述。
CDATA類型
CDATA指的是純文本,即由字符、符號"&""""""<"""""""""""""" 當然,就象我們前面講到的,你應該使用實體 代替"&""<代替"<"" "代替""""
請看下面這個關於劇本的例子︰
<?xml version = "1.0"
encoding="GB2312"
standalone = "yes"?>
<!DOCTYPE 劇本 [
<!ELEMENT 劇本 ANY>
<!ELEMENT 對話 (#PCDATA)>
<!ATTLIST 對話 演員 CDATA>
]>
<劇本>
<對話 演員="某甲">我可不這么認為﹗</對話>
<對話 演員="某乙">為什麼呢?</對話>
</劇本>
枚舉類型
屬性也可以被描述為一組可接受的取值的列表,XML文件中對屬性的賦值將從這個列表中選取一個值。這類屬性屬于枚舉類型ENUMERATED,不過,關鍵字ENUMERATED是不出現下DTD定義中的。
<?xml version = "1.0"
encoding="GB2312"
standalone = "yes"?>
<!DOCTYPE 購物籃 [
<!ELEMENT 購物籃 ANY>
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 類型( 雞肉 | 牛肉 | 豬肉 | 魚肉 ) "雞肉">
]>
<購物籃>
<肉 類型 = "魚肉"/>
<肉 類型 = "牛肉"/>
<肉/>
</購物籃>
注意,在上面這個例子中,給屬性"""""""""""""""""""""""""""""""""""""""""""""
IDIDREF
ID類型
ID是用屬性值的模式為文件中的某個元素定義唯一標識的方法,它的作用類似于 HTML文件中的內部鏈接。在大多數情況下,ID由處理文件的程式或腳本語言使用。
ID的值必須是一個有效的XML名稱,它由字母、數字或下劃線開始,名字中不能出 現空白符。另外一般而言,不要給ID類型的屬性事先指定缺省值,這很容易引起不 同的元素具有相同的標識的情況,更不能使用FIXED型的缺省值。此類屬性經常使 用REQUIRED缺省類型,當然,這也不是必須的。有的應用並不要求每個元素都有 自己的標識,所以,也可以使用IMPLIED缺省類型。
<?xml version = "1.0"
encoding="GB2312"
standalone = "yes"?>
<!DOCTYPE 聯繫人列表[
<!ELEMENT 聯繫人列表 ANY>
<!ELEMENT 聯繫人(姓名,EMAIL)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
<!ATTLIST 聯繫人 編號 ID #REQUIRED>
]>

<聯繫人列表>
<聯繫人 編號="1">
<姓名>張三</姓名>
<EMAIL>zhang@aaa.com</EMAIL>
</聯繫人>

<聯繫人 編號="2">
<姓名>李四</姓名>
<EMAIL>li@bbb.org</EMAIL>
</聯繫人>
</聯繫人列表>
IDIDREF2
IDREF類型
IDREF類型允許一個元素的屬性使用文件中的另一個元素,方法就是把那個元素的 ID標識值作為該屬性的取值。例如下面的例子︰
<?xml version = "1.0"
encoding="GB2312"
standalone = "yes"?>
<!DOCTYPE 聯繫人列表[
<!ELEMENT 聯繫人列表 ANY>
<!ELEMENT 聯繫人(姓名,EMAIL)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
<!ATTLIST 聯繫人 編號 ID #REQUIRED>
<!ATTLIST 聯繫人 上司 IDREF #IMPLIED>
]>

<聯繫人列表>
<聯繫人 編號="2">
<姓名>張三</姓名>
<EMAIL>zhang@aaa.com</EMAIL>
</聯繫人>

<聯繫人 編號="1" 上司="2">
<姓名>李四</姓名>
<EMAIL>li@aaa.com</EMAIL>
</聯繫人>
</聯繫人列表>
NMTOKENNMTOKENS
類型NMTOKEN和NMTOKENS是諸多屬性類型中面向處理程式的又一個類型。這兩個 類型用于指示一個有效的名字。當需要把一個元素和其它的元件,例如一個JAVA 類或一個安全算法,相聯繫時,可以讓它們助你一臂之力。請看下面的例子︰
關於元素的定義︰
<!ELEMENT 數據(#PCDATA)>
<!ATTLIST 數據
安全性( ON | OFF ) "OFF"
授權用戶 NMTOKENS #IMPLIED
>
XML 文件 :
<數據 安全性="ON" 授權用戶 = "IggieeB SelenaS GuntherB">
blah blah blah
</數據>
NOTATION類型
NOTATION類型允許屬性值為一個DTD中聲明的符號,這個類型對于使用非XML格式的數據非常有用。
現實世界中存在著很多無法或不易用XML格式組織的數據,例如圖象、聲音、影象等 等。對于這些數據,XML應用程式常常並不提供直接的應用支持。透過為它們設定 NOTATION類型的屬性,可以向應用程式指定一個外部的處理程式。例如,當你想要 為一個給定的文件類型指定一個演示設備時,可以用NOTATION類型的屬性作為觸發。
要使用NOTATION類型作為屬性的類型,首先要在DTD中為可選用的記號作出定義。 定義的模式有兩種,一種是使用MIME類型,形式是︰
<﹗NOTATION 記號名 SYSTEM "MIME類型">
再有一種是使用一個URL路徑,指定一個處理程式的路徑。
<﹗NOTATION 記號名 SYSTEM "URL路徑名">
在下面這個例子中,為"電影"元素指定了兩種可選設備︰一種是movPlayer.exe,用來播映.mov文件,另一種則用來繪製GIF圖象。
<?xml version = "1.0"
encoding="GB2312"
standalone = "yes"?>
<!DOCTYPE 文件[
<!ELEMENT 文件 ANY>
<!ELEMENT 電影 EMPTY>
<!ATTLIST 電影 演示設備 NOTATION ( mp | gif ) #REQUIRED>
<!NOTATION mp SYSTEM "movPlayer.exe">
<!NOTATION gif SYSTEM "Image/gif">
]>

<文件>
<電影 演示設備 = "mp"/>
</文件>
實體屬性類型與參數實體
實體在XML中充當著宏或別名的角色。實體最根本的作用是幫助你為一大段文本創 建一個別名,這樣,在文件的另一個位置需要引用這段文本時,僅需要指向它的別 名就可以了。它還意味著一旦需要修改,僅需要在一個地方作改動,就完成了全局 的改動。
我們還提到,實體分為一般實體和參數實體兩種類型,它們都可以定義為內部的也 可以用關鍵字SYSTEM定義為外部的。實體的定義必須出現下引用之前,而且要注意 正確巢狀,不能出現循環引用的情況。在DTD中,這兩種類型的實體都得到了廣泛的 應用。
實體屬性類型
實體類型的屬性值屬于一般實體,如前所述,它的定義模式是︰ <!ENTITY 實體名 "實體內容">
或利用SYSTEM定義外部實體,模式為︰ <!ENTITY 實體名 SYSTEM "外部文件名">
引用模式為︰ &實體名;
使用關鍵字ENTITY,則聲明一個屬性是實體類型,它的取值為已定義的實體。請看下面例子︰
<?xml version = "1.0"
encoding="GB2312"
standalone = "yes"?>
<!DOCTYPE 文件[
<!ELEMENT 文件 ANY>
<!ELEMENT 電影 EMPTY>
<!ATTLIST 電影 來源 ENTITY #REQUIRED>
<!ENTITY BladeRunner SYSTEM "dvds/BR/br.mov">
]>

<文件>
<電影 來源 = "&BladeRunner;">
</文件>
參數實體 參數實體專門用在DTD中。定義模式是︰ <!ENTITY % 實體名 "實體內容">
或︰ <!ENTITY % 實體名 SYSTEM "外部文件名">
引用模式為︰ %實體名; 使用參數實體,可以方便元素和屬性的聲明。例如︰
<!ENTITY % TAG_NAMES "姓名 | EMAIL | 電話 | 位址">
<!ELEMENT 個人聯繫訊息 (%TAG_NAMES; | 生日)>
<!ELEMENT 客戶聯繫訊息 (%TAG_NAMES; | 公司名)>
最後提醒大家注意,不要以為實體屬性類型的定義與DTD有關,所以它使用的就是參數 實體。參數實體只能在DTD中使用,而對于任何元素屬性值的指定(除了缺省值外), 都是在XML文件正文中進行的,因此實體屬性值仍屬于一般實體。
Comments (Hide)
<?xml version="1.0" encoding="unicode"?>
<!ELEMENT 書店 (產品)>
<!ELEMENT 產品 (書本,音樂,電影)>
<!ELEMENT 書本 (名稱1,作者1,價格1)>
<!ELEMENT 音樂 (名稱2,作者2,價格2)>
<!ELEMENT 電影 (名稱3,作者3,價格3)>
<!ELEMENT 名稱1 (#PCDATA)>
<!ELEMENT 作者1 (#PCDATA)>
<!ELEMENT 價格1 (#PCDATA)>
<!ELEMENT 名稱2 (#PCDATA)>
<!ELEMENT 作者2 (#PCDATA)>
<!ELEMENT 價格2 (#PCDATA)>
<!ELEMENT 名稱3 (#PCDATA)>
<!ELEMENT 作者3 (#PCDATA)>
<!ELEMENT 價格3 (#PCDATA)>


Posted by Anonymous at Oct 04, 2005 21:59 | Permalink
<HTML>
<HEAD>
<TITLE>問題</TITLE>
</HEAD>
<BODY onload="init();getquestion(0);" bgcolor="#99FFFF">
<br>
<SCRIPT LANGUAGE="JavaScript" >
<!--
var xmlDoc ;
var root;
var curNo=0;
function init(event)
Unknown macro: { xmlDoc = new ActiveXObject("Microsoft.XMLDOM") xmlDoc.async="false"; xmlDoc.load("quiz.xml"); root = xmlDoc.documentElement; }

function getquestion(no){
if( no < 0 )
Unknown macro: { curNo = no = 0; alert("已經到第一題了"); }
if(root.childNodes.length<=parseInt(no))
Unknown macro: { curNo = no = root.childNodes.length-1; alert("結束!!"); }
qdata0.innerText=root.childNodes.item(parseInt(no)).childNodes.item(0).text;
qdata1.innerText=root.childNodes.item(parseInt(no)).childNodes.item(1).text;
qdata2.innerText=root.childNodes.item(parseInt(no)).childNodes.item(2).text;
qdata3.innerText=root.childNodes.item(parseInt(no)).childNodes.item(3).text;
qdata4.innerText=root.childNodes.item(parseInt(no)).childNodes.item(4).text;
}
function choice(qNo)
Unknown macro: { var curChoice = root.childNodes.item(curNo).childNodes.item(qNo).text; var curAns=root.childNodes.item(curNo).lastChild.text; if( curChoice != curAns )alert("喔喔..你錯啦!"); else alert("恭喜你答對啦!"); }

-->
</SCRIPT>
<div id="q" style="font-weight:bold;font-size:16" >問題 :
<span id="qdata0" style="font-weight:normal"></span>
</div>
<div id="q" style="font-weight: bold; font-size: 16; width: 892; height: 19" >
<p>
<INPUT TYPE="radio" value="q1" name="myradio" onclick="choice(1)">
<span id="qdata1" style="font-weight:normal"></span>
</div>
<div id="q" style="font-weight:bold;font-size:16" >
<p>
<INPUT TYPE="radio" value="q2" name="myradio" onclick="choice(2)">
<span id="qdata2" style="font-weight:normal"></span>
</div>
<div id="q" style="font-weight:bold;font-size:16" >
<p>
<INPUT TYPE="radio" value="q3" name="myradio" onclick="choice(3)">
<span id="qdata3" style="font-weight:normal"></span>
</div>
<div id="q" style="font-weight:bold;font-size:16" >
<p>
<INPUT TYPE="radio" value="q4" name="myradio" onclick="choice(4)">
<span id="qdata4" style="font-weight:normal"></span>
</div> 
<p>
<INPUT TYPE="button" value="上一題" onclick="getquestion(--curNo)">
<INPUT TYPE="button" value="下一題" onclick="getquestion(++curNo)">
</p>
</BODY></HTML>


Posted by Anonymous at Nov 02, 2005 12:04 | Permalink
<?xml version="1.0" encoding="unicode"?>
<!ELEMENT 書店 (產品)>
<!ELEMENT 產品 (書本,音樂,電影)>
<!ELEMENT 書本 (名稱1,作者1,價格1)>
<!ELEMENT 音樂 (名稱2,作者2,價格2)>
<!ELEMENT 電影 (名稱3,作者3,價格3)>
<!ELEMENT 名稱1 (#PCDATA)>
<!ELEMENT 作者1 (#PCDATA)>
<!ELEMENT 價格1 (#PCDATA)>
<!ELEMENT 名稱2 (#PCDATA)>
<!ELEMENT 作者2 (#PCDATA)>
<!ELEMENT 價格2 (#PCDATA)>
<!ELEMENT 名稱3 (#PCDATA)>
<!ELEMENT 作者3 (#PCDATA)>
<!ELEMENT 價格3 (#PCDATA)>

转至javaworld.tw
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: