DTD是什麼?Document Type Definition——文檔類型定義。css
在作自定義標籤的時候,寫標籤庫定義文件tld時,要寫一大段東東:<!DOCTYPE ...... >。當時只知道拷貝、粘貼,也沒有去想這是什麼東西。今天才知道,這玩意兒叫DTD。是爲了規範xml文檔元素編寫的。java
DTD的語法規定,DTD的全部關鍵字都是大寫的,如DOCTYPE,ELEMENT等,它分爲兩種。web
一、內部DTD。注意的是在元素名後面必定要有空格,不然就不是格式良好的
<!DOCTYPE 根元素名 [
<!ELEMENT 元素名 (元素類型定義)>
]>
如對下面這個xml文檔的類型定義:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE poem [
<!ELEMENT poem (title,author,line+)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT line (#PCDATA)>
]>
<poem>
<title>靜夜思</title>
<author>李白</author>
<line>牀前明月光,</line>
<line>疑事地上霜.</line>
<line>舉頭望明月,</line>
<line>低頭思故鄉.</line>
</poem>jsp
二、外部DTD
若是吧DTD放在xml文檔內部,一方面會帶來xml文檔變大,一些程序可能不須要DTD信息;另外一方面不利於DTD共用,也許會有不一樣的xml文檔共用這個DTD。這就是外部DTD存在的緣由。spa
定義外部DTD的語法:
<!DOCTYPE 根元素名 SYSTEM "外部DTD文件的URI">(SYSTEM表示DTD文件是私有的。引號不能少)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="simple1.css" type="text/css" ?>
<!-- 外部DTD -->
<!DOCTYPE poem SYSTEM "poem.dtd">
<poem>
<title>靜夜思</title>
<author>李白</author>
<line>牀前明月光,</line>
<line>疑事地上霜.</line>
<line>舉頭望明月,</line>
<line>低頭思故鄉.</line>
<commet>李白是中國最偉大的詩人!</commet>
</poem>
-----------------------------相同目錄下的poem.dtd內容以下:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT poem (title,author,line+,commet)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT line (#PCDATA)>
<!ELEMENT commet (#PCDATA)>xml
若是想引用一個公共的DTD文檔,又該如何呢?
<!DOCTYPE 根元素名 PUBLIC "DTD的名稱" "外部DTD文件的URI">(PUBLIC表示DTD文件是公共的,注意在PUBLIC以後,還多了一個DTD的名稱。引號不能少)
下面是taglib的DTD:
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
分析一下這個外部DTD聲明:
一、關鍵字DOCTYPE,PUBLIC。
二、根元素名:taglib。因此每個標籤庫定義文件都是以taglib爲根元素的,不然就不會驗證經過。
三、紫色的字"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN",這是公共DTD的名稱。這個東西命名是有些講究的。首先它是以"-"開頭的,表示這個DTD不是一個標準組織制定的。(若是是ISO標準化組織批准的,以「ISO」開頭,若是不是ISO的標準化組織批准的,以「+」開頭。)。接着就是雙斜槓「//」,跟着的是DTD全部者的名字,很明顯這個DTD是sun公司定的。接着又是雙斜槓「//」,而後跟着的是DTD描述的文檔類型,能夠看出這份DTD描述的是jsp 標籤庫1.2版本的格式。再跟着的就是「//」和ISO 639語言標識符。
四、綠色的字"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd",表示這個DTD的位置。
疑問:是否是xml分析器都會到java.sun.com上去找這個dtd呢?答案是否認的,xml分析器首先會以某種機制查找公共DTD的名稱,查到了,則以此爲標準,若是查不到,再到DTD位置上去找。文檔