http://www-128.ibm.com/developerworks/cn/xml/x-dtdint/index.html
XML 的優點在於它允許您定義自己的有意義的標記,因此您可以最大程度地定製文檔。但 XML 就是 XML(可擴展),而人就是人(瘋狂的人),這可能很快就會無法控制。解決方案是 DTD,它指定了 XML 文檔的標記。簡而言之,DTD 指定:可以在文檔中存在的元素、那些元素可以具有的屬性、在元素內部元素的層次結構以及元素在整個文檔中出現的順序。
雖然 DTD 不是必需的,但它們確實帶來方便。DTD 適合三個基本用途。它能:
- 對標記編制文檔
- 加強標記參數內部的一致性
- 使 XML 語法分析器能夠確認文檔
如果不對 XML 文檔進行 DTD 定義,文檔就無法由 XML 語法分析器進行確認。使用 XML Schema 實例來代替 DTD 如何?(請參閱側欄 模式如何?)清單 3 是清單 1 中顯示的 XML 文檔的 DTD。
<!ELEMENT firstname (#PCDATA)>
<!ELEMENT lastname (#PCDATA)>
<!ELEMENT nothing EMPTY>
清單 3 中 DTD 的第一行定義了 XML 文檔的父元素: person
。person 元素有兩個子元素: firstname
和 lastname
。
第二和第三行包含了元素屬性 #PCDATA
,它表明 firstname
和 lastname
元素可能包含經過語法分析的字符數據(在這種情況下是文本)。DTD 文件的最後一行描述了一個空標記: nothing
。
從清單 3 中的 DTD 可以看出,任何閱讀我們的 XML 文檔的人(以及對它進行語法分析的語法分析器)都知道 person
元素僅包含兩個文本元素: firstname
和 lastname
。此外,DTD 規定,在整個文檔中, firstname
元素必須在 lastname
元素之前出現。
在轉到更復雜的示例之前,讓我們回顧一下一些最常用的 DTD 語法元素。可以在 W3C 主頁上找到完整的 DTD 規範(請參閱 參考資料)。
A、B、C 和 D 是在下例中代表元素的變量。
元素必須有正好一個 A
、至少一個 B
(由加號表示)、零個或多個 C
(由星號表示)以及零個或一個 D
(由問號表示):
元素可能有 A
或 B
或 C
之一:
元素不包含任何內容:
<!ELEMENT element EMPTY>
元素可以包含在 DTD 中列出的任何元素:
<!ELEMENT element ANY> |
元素可能包含經過語法分析的字符數據或另一個元素( element2
)。星號(*)表示混合內容模型 — 其中元素可以包含不同類型的屬性。
<!ELEMENT element (#PCDATA|element2)*> |
下例將文本 "entity reference" 插到文檔中它出現的任何地方:
<!ENTITY element "entity reference"> |
可以看到在 XML 文檔中該實體引用元素如下:
&element; |
下例表明其元素是一個包含三個屬性的空標記:屬性 1( att1
)是一個可選屬性,屬性 2( att2
)是帶有固定值 "A"
的屬性,屬性 3( att3
)是必需的文本屬性。
<!ELEMENT element EMPTY>
<!ATTLIST element
att1 ID #IMPLIED
att2 CDATA #FIXED "A"
att3 CDATA #REQUIRED>
|
可以看到在 XML 文檔中使用的這個元素如下:
<element att2="A" att3="MustHave"/> |
屬性 CDATA
表示包括的信息應該是文本。 ID
屬性表明必須填入唯一的標識。每個元素只能有一個 ID
屬性。另外, CDATA
表示 att2
和 att3
可能包含任何字符串。