前面的兩篇xml相關博文:
第一篇是介紹格式正規的XML: 格式正規的XML:語法 屬性 實體 處理指令 樣式單 CDATA節
第二篇介紹DTD,引入有效的XML的概念(符合語法規范并符合DTD要求),并介紹DTD的三種使用方法:有效的XML: DTD(文檔類型定義)介紹與三種使用方式
一個有效的XML文檔必然是結構正規的,結構正規的XML文檔不一定是有效的,即有效的是格式正規的一個子集。
本文詳細介紹DTD,包括其對元素的定義,屬性的定義,以及實體的定義。
DTD中的修飾符號:
這部分符號可以聯系正則表達式的符號來記憶。
屬性類型——CDATA
比如:
<!ATTLIST title name CDATA #REQUIRED>
定義了一個屬性,是屬于title元素的,屬性名叫name,類型是字符串(包括數字和中文),并且是一個必須要有的屬性。
屬性類型——NMTOKEN/NMTOKENS
左邊圖中因為加了空格而出錯。
屬性類型——ID
類型為ID的屬性取值必須是唯一的。
從這個例子還可以看到同一個元素可以一次定義多個屬性,多個屬性之間用空格分隔即可。
屬性類型——IDREF/IDREFS
(“兒子”后面漏掉了一個斜線)
屬性類型——Enumerated
實現定義好一些值,屬性的值必須在所列出的值的范圍內。
屬性的特點
#REQUIRED
元素的所有實例都必須有該屬性的值(NOT NULL)。
語法:
<!ATTLIST 元素名 屬性名 屬性類型 #REQUIRED>
DTD示例:
<!ATTLIST person number CDATA #REQUIRED>
XML示例:
<person number="6788"/>
#IMPLIED
元素的實例中可以忽略該屬性(NULL)。
語法:
<!ATTLIST 元素名 屬性名 屬性類型 #IMPLIED>
DTD示例:
<!ATTLIST contact fax CDATA #IMPLIED>
XML示例:
<contact fax="888-228833"/>
沒有這個屬性也是對的。
#FIXED value
元素實例中該屬性的值必須為指定的固定值。
語法:
<!ATTLIST 元素名 屬性名 屬性類型 #FIXED "value">
DTD示例:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
XML示例:
<sender company="Microsoft"/>
Default value
為屬性提供一個默認的值。
語法:
<!ATTLIST 元素名 屬性名 屬性類型 "value">
DTD示例:
<!ATTLIST hello paymenttype CDATA "check">
XML示例:
<hello paymenttype="check"/>
定義實體
一般
語法:
<!ENTITY 實體名 "實體值">
DTD示例:
<!ENTITY writer "Donald Duck"><!ENTITY copyright "Copyright W3Schools">
XML示例:
<author>&writer;©right;</author>
外部實體:
語法:
<!ENTITY 實體名 SYSTEM "URI/URL">
DTD示例:
<!ENTITY writer SYSTEM "http://www.baidu.com/index.php?tn=coralQQ"><!ENTITY copyright SYSTEM "http://www.baidu.com/index.php?tn=coralqq">
XML示例:
<author>&writer;©right;</author>
與上面的區別就是加上了SYSTEM關鍵字。
這樣就不是使用網址的字符串來代替,而是用網址的文檔本身內容。
實體類型
前面所講的都是普通實體,分為內部實體和外部實體。
所謂參數實體,該實體實際上不是在具體實例化文檔中使用,而是在DTD文檔內部被使用。
我們可以定義一個實體,然后在DTD內部來引用它。
如下:
<!ENTITY %地址 "街道,城市,郵編,國家"><!ELEMENT 聯系人 (人名,電話,%地址;)>
總結如下:
普通實體:DTD中定義,XML中使用,使用格式: &名;
參數實體:DTD中定義,定義的時候要用%,DTD中使用,使用格式: %名;
普通實體和參數實體都分為內部實體和外部實體兩種,外部實體定義需要加上SYSTEM關鍵字,其內容是URL所指向的外部文件實際的內容。
如果不加SYSTEM關鍵字,則為內部實體,表示實體指代內容為字符串。
新聞熱點
疑難解答