XML中DTD筆記

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 實體引用:"&nbsp;"。這個“無折行空格”實體在 HTML 中被用於在某個文檔中插入一個額外的空格。

當文檔被 XML 解析器解析時,實體就會被展開。

下面的實體在 XML 中被預定義:

實體引用 字符
&lt; <
&gt; >
&amp; &
&quot; "
&apos; '

PCDATA

PCDATA 的意思是被解析的字符數據(parsed character data)。

可把字符數據想象爲 XML 元素的開始標籤與結束標籤之間的文本。

PCDATA 是會被解析器解析的文本。這些文本將被解析器檢查實體以及標記。

文本中的標籤會被當作標記來處理,而實體會被展開。

不過,被解析的字符數據不應當包含任何 &、< 或者 > 字符;需要使用 &amp;、&lt; 以及 &gt; 實體來分別替換它們。

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;&copyright;</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;&copyright;</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)

Try it Yourself 或者 僅僅看一下這個 XML 文件

關閉驗證

通過把 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)

Try it Yourself

通用的 XML 驗證器

爲了幫助您驗證 XML 文件,我們創建了此鏈接,這樣你就可以驗證任何 XML 文件了。

parseError 對象

您可以在我們的《XML DOM 教程》中閱讀更多有關 parseError 對象的信息。


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)

Try it Yourself 或者 僅僅看一下這個 XML 文件

關閉驗證

通過把 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)

Try it Yourself

通用的 XML 驗證器

爲了幫助您驗證 XML 文件,我們創建了此鏈接,這樣你就可以驗證任何 XML 文件了。

parseError 對象

W3S School :http://www.w3school.com.cn/dtd/index.asp

發佈了13 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章