前面的兩篇xml相關(guān)博文:
第一篇是介紹格式正規(guī)的XML: 格式正規(guī)的XML:語法 屬性 實體 處理指令 樣式單 CDATA節(jié)
第二篇介紹DTD,引入有效的XML的概念(符合語法規(guī)范并符合DTD要求),并介紹DTD的三種使用方法:有效的XML: DTD(文檔類型定義)介紹與三種使用方式
一個有效的XML文檔必然是結(jié)構(gòu)正規(guī)的,結(jié)構(gòu)正規(guī)的XML文檔不一定是有效的,即有效的是格式正規(guī)的一個子集。
本文詳細(xì)介紹DTD,包括其對元素的定義,屬性的定義,以及實體的定義。
DTD中的修飾符號:
這部分符號可以聯(lián)系正則表達(dá)式的符號來記憶。
屬性類型——CDATA
比如:
<!ATTLIST title name CDATA #REQUIRED>
定義了一個屬性,是屬于title元素的,屬性名叫name,類型是字符串(包括數(shù)字和中文),并且是一個必須要有的屬性。
屬性類型——NMTOKEN/NMTOKENS
左邊圖中因為加了空格而出錯。
屬性類型——ID
類型為ID的屬性取值必須是唯一的。
從這個例子還可以看到同一個元素可以一次定義多個屬性,多個屬性之間用空格分隔即可。
屬性類型——IDREF/IDREFS
(“兒子”后面漏掉了一個斜線)
屬性類型——Enumerated
實現(xiàn)定義好一些值,屬性的值必須在所列出的值的范圍內(nèi)。
屬性的特點
#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
為屬性提供一個默認(rèn)的值。
語法:
<!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>
與上面的區(qū)別就是加上了SYSTEM關(guān)鍵字。
這樣就不是使用網(wǎng)址的字符串來代替,而是用網(wǎng)址的文檔本身內(nèi)容。
實體類型
前面所講的都是普通實體,分為內(nèi)部實體和外部實體。
所謂參數(shù)實體,該實體實際上不是在具體實例化文檔中使用,而是在DTD文檔內(nèi)部被使用。
我們可以定義一個實體,然后在DTD內(nèi)部來引用它。
如下:
<!ENTITY %地址 "街道,城市,郵編,國家"><!ELEMENT 聯(lián)系人 (人名,電話,%地址;)>
總結(jié)如下:
普通實體:DTD中定義,XML中使用,使用格式: &名;
參數(shù)實體:DTD中定義,定義的時候要用%,DTD中使用,使用格式: %名;
普通實體和參數(shù)實體都分為內(nèi)部實體和外部實體兩種,外部實體定義需要加上SYSTEM關(guān)鍵字,其內(nèi)容是URL所指向的外部文件實際的內(nèi)容。
如果不加SYSTEM關(guān)鍵字,則為內(nèi)部實體,表示實體指代內(nèi)容為字符串。
新聞熱點
疑難解答