做者:wuxinliulei
連接:https://www.zhihu.com/question/38843167/answer/78782017
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
java
DTD(Document Type Definition)和XSD(XML Schemas Definition)是XML文檔的描述文件,用於檢驗XML文檔格式的正確性。web
TLD(taglib description)是JSP的標籤庫描述文件。如要在JSP頁面中實現JSP標籤,必須首先定義實現標籤的類,而後在標籤庫描述文件(TLD)中將寫好的類映射成jsp標籤,最後在JSP文件中使用定義好的標籤,就能夠生成動態的JSP內容。
---------------------------------------------------------
DTD(Document Type Definition) 是一套關於標記符的語法規則。
它是XML1.0版規格的一部分,是XML文件的驗證機制,屬於XML文件組成的一部分。DTD 是一種保證XML文檔格式正確的有效方法,可經過比較XML文檔和DTD文件來看文檔是否符合規範,元素和標籤使用是否正確。XML文件提供應用程序一個 數據交換的格式,DTD正是讓XML文件能成爲數據交換標準,由於不一樣的公司只需定義好標準DTD,各公司都能依DTD創建XML文件,而且進行驗證,如 此就能夠輕易的創建標準和交換數據,這樣知足了網絡共享和數據交互。DTD文件是一個ASCII文本文件,後綴名爲.dtd。網絡
1)爲何須要dtd,xsd 這種xml文檔定義描述?
對於一個格式良好的XML文檔,咱們只能保證這個文檔的格式符合XML規範,可是元素與元素之間的關係、元素與屬性的關係,屬性的取值是否正確,咱們就沒法得知了。對於一個格式良好的文檔,若是僅僅是在有限的應用中使用,或者做爲數據的存儲傳輸,那麼也能很好的知足咱們的應用。可是若是要讓其餘用戶理解你的XML文檔,或者和其餘的應用進行數據交換,那麼就有必要提供一種機制,來保證咱們所寫的XML文檔和別人所寫的XML文檔其結構是相同的,元素與元素之間的關係是正確的,屬性的取值也是符合要求的。app
2)在XML當中引入DTD有哪些方式?
咱們能夠直接在XML文檔中定義DTD,也能夠經過URI引用外部的DTD文件,或者同時採用這兩種方式。
①XML文檔中內部定義DTD
內部的 DOCTYPE 聲明,經過下面的語法包裝在一個 DOCTYPE 聲明中:jsp
<!DOCTYPE 根元素 [元素聲明]>
帶有 DTD 的 XML 文檔實例 測試
<?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend</body> </note>
以上 DTD 解釋以下:this
!DOCTYPE note (第二行)定義此文檔是 note 類型的文檔。
!ELEMENT note (第三行)定義 note 元素有四個元素:"to、from、heading,、body"
!ELEMENT to (第四行)定義 to 元素爲 "#PCDATA" 類型
!ELEMENT from (第五行)定義 from 元素爲 "#PCDATA" 類型
!ELEMENT heading (第六行)定義 heading 元素爲 "#PCDATA" 類型
!ELEMENT body (第七行)定義 body 元素爲 "#PCDATA" 類型code
再舉一個例子:xml
<?xml version="1.0" encoding="gb2312" standalone="yes"> <!DOCTYPE greeting [ <!ELEMENT greeting (#PCDATA)> ]>
文檔類型聲明由<! 開始,後面緊跟一個關鍵字DOCTYPE,而後是文檔根元素的名稱,接下來是標記生命塊,標記聲明塊是放在左中括號 [ 和右中括號 ] 之間的,由一個或者多個標記聲明構成,最後由> 結束。
在DTD當中,全部關鍵字都是大寫的,就像在這裏看到的ELEMENT、#PCDATA同樣,在後面咱們還會看到其餘的關鍵字。不過在DTD中定義的元素和屬性的大小寫是能夠任意指定的,可是要注意,XML文檔是大小寫相關的,因此一旦給一個元素命名嗎,那麼整個文檔中都要使用相同的大小寫。例如:greeting 和Greeting是兩個不一樣的元素名。ip
在XML文檔中定義DTD,比較直觀,修改也比較方便,並且不用擔憂XML處理器找不到DTD,可是它也有一些缺點:
1.在文檔中定義DTD會致使文檔自己的長度增長,在傳輸數據市,即便不須要驗證文檔的有效性,這些聲明也會隨文檔一塊兒傳輸。
2.若是多個XML文檔須要共用一個DTD,咱們就須要在每一個文檔中加入DTD,這是至關繁瑣的。
要解決上面兩個問題,咱們將dtd放到一個單獨的文件中去定義,在XML文檔中,經過URI外部引用
(有沒有發現寫程序的時候的#include 和import也有一樣的功效重用代碼)
② 外部文檔聲明
假如 DTD 位於 XML 源文件的外部,那麼它應經過下面的語法被封裝在一個 DOCTYPE 定義中:
<!DOCTYPE 根元素 SYSTEM "外部DTD文件的URI">
SYSTEM關鍵字表示文檔使用的是私有的DTD文件,「外部DTD文件的URI」能夠是相對URI或者絕對URI,相對URI是相對文檔類型聲明所在文檔的位置。
好比
<!DOCTYPE greeting SYSTEM "hello.dtd">
咱們將DTD的定義放到了hello.dtd文件中,注意要將hello.dtd放在和XML文檔同一目錄下,這樣XML處理器才能找到這個文件。在給DTD文件取名字的時候,文件名能夠隨便取,但擴展名通常爲.dtd
若是位於不一樣位置的多個XML文檔要使用同一個DTD,咱們可使用絕對URI來指明DTD文件的地址。假定hello.dtd位於
http://www.guowuxin.org/xml/hello.dtd
咱們能夠在文檔類型聲明中使用此URI
<!DOCTYPE greeting SYSTEM "http://www.guowuxin.org/xml/hello.dtd">
若是是一種企業或者行業領域標準,則不建議使用SYSTEM,而是使用public修飾
<!DOCTYPE 根元素的名字 PUBLIC 「DTD的名稱」 「外部DTD文件的URI」>
PUBLIC關鍵字用於聲明公共的DTD,而且這個DTD還有一個名稱,「DTD的名稱」 也稱爲公共標識符
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
好比上面是servlet2.3中web.xml的DTD
根元素web-app
PUBILC "-//全部者//DTD文檔描述的類型//ISO639語言標識符" 「外部DTD文件URI」
下面這個 XML 文檔和上面的第一個 XML 文檔相同,可是擁有一個外部的 DTD:
<?xml version="1.0"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
這是包含 DTD 的 "note.dtd" 文件:
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
經過 DTD,每個 XML 文件都可攜帶一個有關其自身格式的描述,獨立的團體可一致地使用某個標準的 DTD 來交換數據。應用程序也可以使用某個標準的 DTD 來驗證從外部接收到的數據。
還可使用 DTD 來驗證自身的數據。
3)DTD的優點
每個XML文檔均可攜帶一個DTD,用來對該文檔格式進行描述,測試該文檔是否爲有效的XML文檔。
既然DTD有外部和內部之分,固然就能夠爲某個獨 立的團體定義一個公用的外部DTD,那麼多個XML文檔就均可以共享使用該DTD,使得數據交換更爲有效。甚至在某些文檔中還可使內部DTD和外部 DTD相結合。
在應用程序中也能夠用某個DTD來檢測接收到的數據是否符合某個標準。
對於XML文檔而言,雖然DTD不是必須的,但它爲文檔的編制帶來了方便。增強了文檔標記內參數的一致性,使XML語法分析器可以確認文檔。
若是不使用DTD來對XML文檔進行定義,那麼XML語法分析器將沒法對該文檔進行確認。
每一個XML文檔都只有一個根元素,其它的子元素都包含在該根元素中。
所以在DTD中對根元素的聲明是必不可少的。
元素聲明的通常形式以下:
<!DOCTYPE root[ <!-- 子元素 --> ]>
DOCTYPE是「document type」(文檔類型)的簡寫,DOCTYPE聲明必須放在文檔最頂部,在全部代碼和標識之上,DOCTYPE聲明是必不可少的關鍵組成部分。DTD語法 要求DOCTYPE必需要大寫,並且DOCTYPE和元素之間必需要有空格隔開,如在以上代碼中DOCTYPE和根元素root之間要有空格隔開。
4)DTD的缺陷 : 利用DTD驗證有效性的解析器,就可以當即對文檔的完整性進行可靠的檢查。DTD雖然比較實用,但DTD也有很多的缺陷。
1): DTD有本身的特殊語法,其自己不是XML文檔;
2): DTD只提供了有限的數據類型,用戶沒法自定義類型;
3): DTD不支持域名機制。
servlet標準在2.5開始就放棄使用dtd,改用了xsd