XML 約束定義了 XML 文件的合法結構、元素、屬性與資料型別。主流有兩種:DTD(Document Type Definition) 與 XML Schema(XSD)。本文聚焦 DTD 基礎語法與引入方式。
DTD 使用簡潔的宣告語法定義元素巢狀關係、出現次序、屬性清單等。雖功能較 Schema 弱(不支援命名空間、資料型別有限),但輕量且廣泛用於舊系統與簡單場景。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>Tom</to> <from>Jerry</from> <heading>Reminder</heading> <body>Meeting at 3pm</body> </note>
系統公共識別符(Public ID):
<!DOCTYPE note PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
系統識別符(System ID,本地或 URL):
<!DOCTYPE note SYSTEM "note.dtd">
| 宣告類型 | 語法範例 | 說明 |
|---|---|---|
| 元素 | <!ELEMENT name (child1, child2*)> | 定義子元素順序與出現次數:?(0/1) *(0+) +(1+) 無符號(1) |
| 屬性 | <!ATTLIST elem attr CDATA #REQUIRED> | 型別:CDATA/ID/IDREF/ENTITY/NMTOKEN 等;限制:#REQUIRED/#IMPLIED/#FIXED |
| 實體 | <!ENTITY name "value"> | 定義可重用文字片段,支援參數實體 %name; |
| 符號 | <!NOTATION name SYSTEM "url"> | 宣告非 XML 資料格式(如圖片) |
外部實體引用(&entityName;)在現代瀏覽器中常被安全策略阻擋。若需顯示實體內容,建議改用內部 DTD或伺服器端解析後再輸出。
初學者先掌握 DTD 核心語法(元素、屬性、實體),理解「良構」與「合法」XML 的差別,再進階學習 XSD 複雜型別、命名空間與驗證 API(javax.xml.validation)。