DTD(文檔類型定義)的作用是定義 XML 文檔的合法構建模塊。
它使用一系列的合法元素來定義文檔結構。DTD 可被成行地聲明於 XML 文檔中,也可作爲一個外部引用。
內部的 DOCTYPE 聲明
假如 DTD 被包含在您的 XML 源文件中,它應當通過下面的語法包裝在一個 DOCTYPE 聲明中:
<!DOCTYPE 根元素 [元素聲明]>
帶有
DTD 的 XML 文檔實例(請在 IE5 以及更高的版本打開,並選擇查看源代碼):
<?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>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
以上 DTD 解釋如下:
!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" 類型
外部文檔聲明
假如 DTD 位於 XML 源文件的外部,那麼它應通過下面的語法被封裝在一個 DOCTYPE 定義中:
<!DOCTYPE 根元素 SYSTEM "文件名"
這個
XML 文檔和上面的 XML 文檔相同,但是擁有一個外部的 DTD: (在
IE5 中打開,並選擇“查看源代碼”命令。)
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
這是包含
DTD 的 "note.dtd" 文件:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
爲什麼使用 DTD?
通過 DTD,您的每一個 XML 文件均可攜帶一個有關其自身格式的描述。
通過 DTD,獨立的團體可一致地使用某個標準的 DTD 來交換數據。
而您的應用程序也可使用某個標準的 DTD 來驗證從外部接收到的數據。
您還可以使用 DTD 來驗證您自身的數據。
DTD - XML 構建模塊
XML 以及 HTML 文檔的主要構建模塊是類似 <body>....</body> 這樣的標籤。
XML 文檔構建模塊
所有的 XML 文檔(以及 HTML 文檔)均由以下簡單的構建模塊構成:
- 元素
- 屬性
- 實體
- PCDATA
- CDATA
下面是每個構建模塊的簡要描述。
元素
元素是 XML 以及 HTML 文檔的主要構建模塊。
HTML 元素的例子是 "body" 和 "table"。XML 元素的例子是 "note" 和 "message" 。元素可包含文本、其他元素或者是空的。空的 HTML 元素的例子是 "hr"、"br" 以及 "img"。
實例:
<body>body text in between</body> <message>some message in between</message>
屬性
屬性可提供有關元素的額外信息。
屬性總是被置於某元素的開始標籤中。屬性總是以名稱/值的形式成對出現的。下面的 "img" 元素擁有關於源文件的額外信息:
<img src="computer.gif" />
元素的名稱是 "img"。屬性的名稱是 "src"。屬性的值是 "computer.gif"。由於元素本身爲空,它被一個 " /" 關閉。
實體
實體是用來定義普通文本的變量。實體引用是對實體的引用。
大多數同學都瞭解這個 HTML 實體引用:" "。這個“無折行空格”實體在 HTML 中被用於在某個文檔中插入一個額外的空格。
當文檔被 XML 解析器解析時,實體就會被展開。
下面的實體在 XML 中被預定義:
實體引用 | 字符 |
---|---|
< | < |
> | > |
& | & |
" | " |
' | ' |
PCDATA
PCDATA 的意思是被解析的字符數據(parsed character data)。
可把字符數據想象爲 XML 元素的開始標籤與結束標籤之間的文本。
PCDATA 是會被解析器解析的文本。這些文本將被解析器檢查實體以及標記。
文本中的標籤會被當作標記來處理,而實體會被展開。
不過,被解析的字符數據不應當包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 實體來分別替換它們。
CDATA
CDATA 的意思是字符數據(character data)。
CDATA 是不會被解析器解析的文本。在這些文本中的標籤不會被當作標記來對待,其中的實體也不會被展開。
DTD - 元素
在一個 DTD 中,元素通過元素聲明來進行聲明。
聲明一個元素
在 DTD 中,XML 元素通過元素聲明來進行聲明。元素聲明使用下面的語法:
<!ELEMENT 元素名稱 類別>
或者
<!ELEMENT 元素名稱 (元素內容)>
空元素
空元素通過類別關鍵詞EMPTY進行聲明:
<!ELEMENT 元素名稱 EMPTY>
例子:
<!ELEMENT br EMPTY>
XML例子:
<br />
只有 PCDATA 的元素
只有 PCDATA 的元素通過圓括號中的 #PCDATA 進行聲明:
<!ELEMENT 元素名稱 (#PCDATA)>
例子:
<!ELEMENT from (#PCDATA)>
帶有任何內容的元素
通過類別關鍵詞 ANY 聲明的元素,可包含任何可解析數據的組合:
<!ELEMENT 元素名稱 ANY>
例子:
<!ELEMENT note ANY>
帶有子元素(序列)的元素
帶有一個或多個子元素的元素通過圓括號中的子元素名進行聲明:
<!ELEMENT 元素名稱 (子元素名稱 1)>
或者
<!ELEMENT 元素名稱 (子元素名稱 1,子元素名稱 2,.....)>
例子:
<!ELEMENT note (to,from,heading,body)>
當子元素按照由逗號分隔開的序列進行聲明時,這些子元素必須按照相同的順序出現在文檔中。在一個完整的聲明中,子元素也必須被聲明,同時子元素也可擁有子元素。"note" 元素的完整聲明是:
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
聲明只出現一次的元素
<!ELEMENT 元素名稱 (子元素名稱)>
例子:
<!ELEMENT note (message)>
上面的例子聲明瞭:message 子元素必須出現一次,並且必須只在 "note" 元素中出現一次。
聲明最少出現一次的元素
<!ELEMENT 元素名稱 (子元素名稱+)>
例子:
<!ELEMENT note (message+)>
上面的例子中的加號聲明瞭:message 子元素必須在 "note" 元素內出現至少一次。
聲明出現零次或多次的元素
<!ELEMENT 元素名稱 (子元素名稱*)>
例子:
<!ELEMENT note (message*)>
上面的例子中的星號聲明瞭:子元素 message 可在 "note" 元素內出現零次或多次。
聲明出現零次或一次的元素
<!ELEMENT 元素名稱 (子元素名稱?)>
例子:
<!ELEMENT note (message?)>
上面的例子中的問號聲明瞭:子元素 message 可在 "note" 元素內出現零次或一次。
聲明“非.../既...”類型的內容
例子:
<!ELEMENT note (to,from,header,(message|body))>
上面的例子聲明瞭:"note" 元素必須包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。
聲明混合型的內容
例子:
<!ELEMENT note (#PCDATA|to|from|header|message)*>
上面的例子聲明瞭:"note" 元素可包含出現零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。
DTD - 屬性
在 DTD 中,屬性通過 ATTLIST 聲明來進行聲明。
聲明屬性
屬性聲明使用下列語法:
<!ATTLIST 元素名稱 屬性名稱 屬性類型 默認值>
DTD 實例:
<!ATTLIST payment type CDATA "check">
XML 實例:
<payment type="check" />
以下是屬性類型的選項:
類型 | 描述 |
---|---|
CDATA | 值爲字符數據 (character data) |
(en1|en2|..) | 此值是枚舉列表中的一個值 |
ID | 值爲唯一的 id |
IDREF | 值爲另外一個元素的 id |
IDREFS | 值爲其他 id 的列表 |
NMTOKEN | 值爲合法的 XML 名稱 |
NMTOKENS | 值爲合法的 XML 名稱的列表 |
ENTITY | 值是一個實體 |
ENTITIES | 值是一個實體列表 |
NOTATION | 此值是符號的名稱 |
xml: | 值是一個預定義的 XML 值 |
默認值參數可使用下列值:
值 | 解釋 |
---|---|
值 | 屬性的默認值 |
#REQUIRED | 屬性值是必需的 |
#IMPLIED | 屬性不是必需的 |
#FIXED value | 屬性值是固定的 |
規定一個默認的屬性值
DTD:
<!ELEMENT square EMPTY> <!ATTLIST square width CDATA "0">
合法的 XML:
<square width="100" />
在上面的例子中,"square" 被定義爲帶有 CDATA 類型的 "width" 屬性的空元素。如果寬度沒有被設定,其默認值爲0 。
#IMPLIED
語法
<!ATTLIST 元素名稱 屬性名稱 屬性類型 #IMPLIED>
例子
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>
合法的 XML:
<contact fax="555-667788" />
合法的 XML:
<contact />
假如您不希望強製作者包含屬性,並且您沒有默認值選項的話,請使用關鍵詞 #IMPLIED。
#REQUIRED
語法
<!ATTLIST 元素名稱 屬性名稱 屬性類型 #REQUIRED>
例子
DTD:
<!ATTLIST person number CDATA #REQUIRED>
合法的 XML:
<person number="5677" />
非法的 XML:
<person />
假如您沒有默認值選項,但是仍然希望強製作者提交屬性的話,請使用關鍵詞 #REQUIRED。
#FIXED
語法
<!ATTLIST 元素名稱 屬性名稱 屬性類型 #FIXED "value">
例子
DTD:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
合法的 XML:
<sender company="Microsoft" />
非法的 XML:
<sender company="W3School" />
如果您希望屬性擁有固定的值,並不允許作者改變這個值,請使用 #FIXED 關鍵詞。如果作者使用了不同的值,XML 解析器會返回錯誤。
列舉屬性值
語法:
<!ATTLIST 元素名稱 屬性名稱 (en1|en2|..) 默認值>
DTD 例子:
<!ATTLIST payment type (check|cash) "cash">
XML 例子:
<payment type="check" />
或者
<payment type="cash" />
如果您希望屬性值爲一系列固定的合法值之一,請使用列舉屬性值。
DTD - 實體
實體是用於定義引用普通文本或特殊字符的快捷方式的變量。
實體引用是對實體的引用。
實體可在內部或外部進行聲明。
一個內部實體聲明
語法:
<!ENTITY 實體名稱 "實體的值">
例子:
DTD 例子:
<!ENTITY writer "Bill Gates"> <!ENTITY copyright "Copyright W3School.com.cn">
XML 例子:
<author>&writer;©right;</author>
註釋: 一個實體由三部分構成: 一個和號 (&), 一個實體名稱, 以及一個分號 (;)。
一個外部實體聲明
語法:
<!ENTITY 實體名稱 SYSTEM "URI/URL">
例子:
DTD 例子:
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> <!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
XML 例子:
<author>&writer;©right;</author>
DTD 驗證
Internet Explorer 5.0 可根據某個 DTD 來驗證您的 XML。
通過 XML 解析器進行驗證
當您試圖打開某個 XML 文檔時,XML 解析器有可能會產生錯誤。通過訪問 parseError 對象,就可以取回引起錯誤的確切代碼、文本甚至所在的行。
註釋:load( ) 方法用於文件,而 loadXML( ) 方法用於字符串。
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM") xmlDoc.async="false" xmlDoc.validateOnParse="true" xmlDoc.load("note_dtd_error.xml") document.write("<br>Error Code: ") document.write(xmlDoc.parseError.errorCode) document.write("<br>Error Reason: ") document.write(xmlDoc.parseError.reason) document.write("<br>Error Line: ") document.write(xmlDoc.parseError.line)
關閉驗證
通過把 XML 解析器的 validateOnParse 設置爲 "false",就可以關閉驗證。
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM") xmlDoc.async="false" xmlDoc.validateOnParse="false" xmlDoc.load("note_dtd_error.xml") document.write("<br>Error Code: ") document.write(xmlDoc.parseError.errorCode) document.write("<br>Error Reason: ") document.write(xmlDoc.parseError.reason) document.write("<br>Error Line: ") document.write(xmlDoc.parseError.line)
通用的 XML 驗證器
爲了幫助您驗證 XML 文件,我們創建了此鏈接,這樣你就可以驗證任何 XML 文件了。
DTD 驗證
Internet Explorer 5.0 可根據某個 DTD 來驗證您的 XML。
通過 XML 解析器進行驗證
當您試圖打開某個 XML 文檔時,XML 解析器有可能會產生錯誤。通過訪問 parseError 對象,就可以取回引起錯誤的確切代碼、文本甚至所在的行。
註釋:load( ) 方法用於文件,而 loadXML( ) 方法用於字符串。
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM") xmlDoc.async="false" xmlDoc.validateOnParse="true" xmlDoc.load("note_dtd_error.xml") document.write("<br>Error Code: ") document.write(xmlDoc.parseError.errorCode) document.write("<br>Error Reason: ") document.write(xmlDoc.parseError.reason) document.write("<br>Error Line: ") document.write(xmlDoc.parseError.line)
關閉驗證
通過把 XML 解析器的 validateOnParse 設置爲 "false",就可以關閉驗證。
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM") xmlDoc.async="false" xmlDoc.validateOnParse="false" xmlDoc.load("note_dtd_error.xml") document.write("<br>Error Code: ") document.write(xmlDoc.parseError.errorCode) document.write("<br>Error Reason: ") document.write(xmlDoc.parseError.reason) document.write("<br>Error Line: ") document.write(xmlDoc.parseError.line)
通用的 XML 驗證器
爲了幫助您驗證 XML 文件,我們創建了此鏈接,這樣你就可以驗證任何 XML 文件了。
parseError 對象
W3S School :http://www.w3school.com.cn/dtd/index.asp