- DTD 有用資源
- DTD - 快速指南
- DTD - 有用資源
DTD - 快速指南
DTD - 概述
XML 文件型別宣告,通常稱為 DTD,是一種精確描述 XML 語言的方法。DTD 檢查 XML 文件的結構和詞彙是否符合相應 XML 語言的語法規則。
XML 文件可以定義為 -
良構 - 如果 XML 文件遵循所有通用 XML 規則,例如標籤必須正確巢狀,開始和結束標籤必須平衡,空標籤必須以 '/>' 結尾,則稱為良構。
或
有效 - 當 XML 文件不僅良構,而且還符合可用的 DTD 時,該 XML 文件就被認為是有效的,DTD 指定了它使用的標籤、這些標籤可以包含哪些屬性以及哪些標籤可以出現在其他標籤內,以及其他屬性。
下圖表示 DTD 用於構建 XML 文件 -
型別
DTD 可以根據其在 XML 文件中的宣告方式進行分類,例如 -
內部 DTD
外部 DTD
當 DTD 在檔案中宣告時,稱為內部 DTD;如果它在單獨的檔案中宣告,則稱為外部 DTD。
我們將在章節DTD 語法中詳細瞭解這些內容。
特徵
以下是 DTD 描述的一些要點 -
可以出現在 XML 文件中的元素。
它們可以出現的順序。
可選和必填元素。
元素屬性以及它們是可選還是必填。
屬性是否可以具有預設值。
使用 DTD 的優勢
文件 - 您可以為 XML 檔案定義自己的格式。檢視此文件,使用者/開發人員可以瞭解資料的結構。
驗證 - 它提供了一種方法來檢查 XML 檔案的有效性,方法是檢查元素是否按正確的順序出現,必填元素和屬性是否到位,元素和屬性是否未以不正確的方式插入,等等。
使用 DTD 的缺點
它不支援名稱空間。名稱空間是一種機制,透過該機制可以將元素和屬性名稱分配給組。但是,在 DTD 中,名稱空間必須在 DTD 內定義,這違反了使用名稱空間的目的。
它只支援文字字串資料型別。
它不是面向物件的。因此,繼承的概念不能應用於 DTD。
表達元素基數的可能性有限。
DTD - 語法
XML DTD 可以指定在文件內,也可以儲存在單獨的文件中,然後文件可以連結到 DTD 文件以使用它。
語法
DTD 的基本語法如下 -
<!DOCTYPE element DTD identifier [ declaration1 declaration2 ........ ]>
在上述語法中 -
DTD 以<!DOCTYPE 分隔符開頭。
元素告訴解析器從指定的根元素開始解析文件。
DTD 識別符號是文件型別定義的識別符號,它可能是系統上檔案的路徑或網際網路上檔案的 URL。如果 DTD 指向外部路徑,則稱為外部子集。
方括號 [ ] 包含一個可選的實體宣告列表,稱為內部子集。
內部 DTD
如果元素在 XML 檔案中宣告,則 DTD 被稱為內部 DTD。要將其引用為內部 DTD,XML 宣告中的standalone屬性必須設定為yes。這意味著宣告獨立於外部源工作。
語法
內部 DTD 的語法如下所示 -
<!DOCTYPE root-element [element-declarations]>
其中root-element是根元素的名稱,element-declarations是宣告元素的位置。
示例
以下是一個內部 DTD 的簡單示例 -
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?> <!DOCTYPE address [ <!ELEMENT address (name,company,phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone (#PCDATA)> ]> <address> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </address>
讓我們來看一下上面的程式碼 -
開始宣告 - 使用以下語句開始 XML 宣告。
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>
DTD - 在 XML 頭之後,緊跟著文件型別宣告,通常稱為 DOCTYPE -
<!DOCTYPE address [
DOCTYPE 宣告在元素名稱的開頭有一個感嘆號 (!) 。DOCTYPE 通知解析器與該 XML 文件關聯的 DTD。
DTD 主體 - DOCTYPE 宣告之後是 DTD 的主體,您可以在其中宣告元素、屬性、實體和符號 -
<!ELEMENT address (name,company,phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone_no (#PCDATA)>
這裡聲明瞭幾個元素,它們構成了<name>文件的詞彙表。<!ELEMENT name (#PCDATA)> 定義元素name的型別為“#PCDATA”。這裡 #PCDATA 表示可解析的文字資料。
結束宣告 - 最後,DTD 的宣告部分使用右括號和右尖括號 (]>) 關閉。這有效地結束了定義,此後,XML 文件緊隨其後。
規則
文件型別宣告必須出現在文件的開頭(僅在 XML 頭之前) - 不允許在文件中的任何其他位置出現。
類似於 DOCTYPE 宣告,元素宣告必須以感嘆號開頭。
文件型別宣告中的 Name 必須與根元素的元素型別匹配。
外部 DTD
在外部 DTD 中,元素在 XML 檔案外部宣告。透過指定系統屬性來訪問它們,系統屬性可以是合法的.dtd檔案或有效的 URL。要將其引用為外部 DTD,XML 宣告中的standalone屬性必須設定為no。這意味著宣告包含來自外部源的資訊。
語法
以下是外部 DTD 的語法 -
<!DOCTYPE root-element SYSTEM "file-name">
其中file-name是副檔名為.dtd的檔案。
示例
以下示例顯示了外部 DTD 的用法 -
<?xml version = "1.0" encoding = "UTF-8" standalone = "no" ?> <!DOCTYPE address SYSTEM "address.dtd"> <address> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </address>
DTD 檔案address.dtd的內容如下所示 -
<!ELEMENT address (name,company,phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone (#PCDATA)>
型別
您可以透過使用系統識別符號或公共識別符號來引用外部 DTD。
系統識別符號
系統識別符號使您能夠指定包含 DTD 宣告的外部檔案的位置。語法如下 -
<!DOCTYPE name SYSTEM "address.dtd" [...]>
如您所見,它包含關鍵字 SYSTEM 和指向文件位置的 URI 引用。
公共識別符號
公共識別符號提供了一種定位 DTD 資源的機制,並按如下方式編寫 -
<!DOCTYPE name PUBLIC "-//Beginning XML//DTD Address Example//EN">
如您所見,它以關鍵字 PUBLIC 開頭,後跟一個專門的識別符號。公共識別符號用於識別目錄中的條目。公共識別符號可以遵循任何格式,但是,一種常用的格式稱為正式公共識別符號或 FPI。
DTD - 元件
本章將從 DTD 的角度討論 XML 元件。DTD 主要包含以下 XML 元件的宣告 -
元素
屬性
實體
元素
XML 元素可以定義為 XML 文件的構建塊。元素可以充當容器,用於儲存文字、元素、屬性、媒體物件或所有這些的混合。
每個 XML 文件都包含一個或多個元素,其邊界由開始標籤和結束標籤或空元素分隔。
示例
以下是一個 XML 元素的簡單示例
<name> Tutorials Point </name>
如您所見,我們定義了一個<name>標籤。在<name>的開始和結束標籤之間有一段文字。元素在 XML-DTD 中使用時需要宣告,這將在章節DTD 元素中詳細討論。
屬性
屬性是 XML 元素的一部分。一個元素可以具有任意數量的唯一屬性。屬性提供有關 XML 元素的更多資訊,或者更準確地說,它定義了元素的屬性。XML 屬性始終是名稱-值對。
示例
以下是一個 XML 屬性的簡單示例 -
<img src = "flower.jpg"/>
這裡img是元素名稱,而src是屬性名稱,flower.jpg是賦予屬性src的值。
如果在 XML DTD 中使用屬性,則需要宣告這些屬性,這將在章節DTD 屬性中詳細討論。
實體
實體是 XML 中的佔位符。這些可以在文件序言或 DTD 中宣告。實體主要可以分為 -
內建實體
字元實體
通用實體
引數實體
有五個內建實體在良構的 XML 中發揮作用,它們是 -
和號:&
單引號:'
大於號:>
小於號:<
雙引號:"
我們將在章節DTD 實體中詳細研究 XML DTD 中的實體宣告。
DTD - 元素
XML 元素可以定義為 XML 文件的構建塊。元素可以充當容器,用於儲存文字、元素、屬性、媒體物件或所有這些的混合。
DTD 元素透過 ELEMENT 宣告進行宣告。當 XML 檔案由 DTD 驗證時,解析器首先檢查根元素,然後驗證子元素。
語法
所有 DTD 元素宣告都具有以下通用形式 -
<!ELEMENT elementname (content)>
ELEMENT宣告用於指示解析器您即將定義一個元素。
elementname是您要定義的元素名稱(也稱為通用識別符號)。
content定義元素內部可以包含哪些內容(如果有)。
元素內容型別
DTD 中元素宣告的內容可以分類如下 -
空內容
元素內容
混合內容
任何內容
空內容
這是元素宣告的一種特殊情況。此元素宣告不包含任何內容。這些使用關鍵字EMPTY宣告。
語法
以下是空元素宣告的語法 -
<!ELEMENT elementname EMPTY >
在上述語法中 -
ELEMENT是EMPTY類別的元素宣告
elementname是空元素的名稱。
示例
以下是一個演示空元素宣告的簡單示例 -
<?xml version = "1.0"?> <!DOCTYPE hr[ <!ELEMENT address EMPTY> ]> <address />
在此示例中,address被宣告為空元素。address元素的標記將顯示為<address />。
元素內容
在帶有元素內容的元素宣告中,內容將是括號內允許的元素。我們也可以包含多個元素。
語法
以下是帶有元素內容的元素宣告語法:
<!ELEMENT elementname (child1, child2...)>
ELEMENT 是元素宣告標籤
elementname 是元素的名稱。
child1, child2.. 是元素,每個元素都必須在 DTD 中有其自己的定義。
示例
下面的例子演示了帶有元素內容的元素宣告的一個簡單示例:
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?> <!DOCTYPE address [ <!ELEMENT address (name,company,phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone (#PCDATA)> ]> <address> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </address>
在上面的例子中,address 是父元素,name、company 和 phone_no 是它的子元素。
運算子和語法規則列表
下表顯示了可以在定義子元素時應用的運算子和語法規則:
| 運算子 | 語法 | 描述 | 示例 |
|---|---|---|---|
| + | <!ELEMENT element-name (child1+)> | 它表示子元素可以在父元素內部出現一次或多次。 | <!ELEMENT address (name+)> 子元素 name 可以在元素名稱 address 內部出現一次或多次。 |
| * | <!ELEMENT element-name (child1*)> | 它表示子元素可以在父元素內部出現零次或多次。 | <!ELEMENT address (name*)> 子元素 name 可以在元素名稱 address 內部出現零次或多次。 |
| ? | <!ELEMENT element-name (child1?)> | 它表示子元素可以在父元素內部出現零次或一次。 | <!ELEMENT address (name?)> 子元素 name 可以在元素名稱 address 內部出現零次或一次。 |
| , | <!ELEMENT element-name (child1, child2)> | 它給出了用逗號分隔的子元素序列,這些子元素必須包含在 element-name 中。 | <!ELEMENT address (name, company)> 子元素 name、company 的順序,必須按相同的順序出現在元素名稱 address 內部。 |
| | | <!ELEMENT element-name (child1 | child2)> | 它允許在子元素中進行選擇。 | <!ELEMENT address (name | company)> 它允許您選擇任一子元素,即 name 或 company,它們必須出現在元素名稱 address 內部。 |
規則
如果有多個元素內容,我們需要遵循某些規則:
序列 - DTD 文件中的元素通常必須以不同的順序出現。如果是這種情況,您可以使用序列定義內容。
宣告表明 <address> 元素必須恰好有三個子元素 - <name>、<company> 和 <phone> - 並且它們必須按此順序出現。例如:
<!ELEMENT address (name,company,phone)>
選擇 - 假設您需要允許一個元素或另一個元素,但不能同時允許兩者。在這種情況下,您必須使用管道 (|) 字元。管道充當異或。例如:
<!ELEMENT address (mobile | landline)>
混合元素內容
這是 (#PCDATA) 和子元素的組合。PCDATA 代表已解析的字元資料,即不是標記的文字。在混合內容模型中,文字可以單獨出現,也可以散佈在元素之間。混合內容模型的規則與上一節討論的元素內容類似。
語法
以下是混合元素內容的通用語法:
<!ELEMENT elementname (#PCDATA|child1|child2)*>
ELEMENT 是元素宣告標籤。
elementname 是元素的名稱。
PCDATA 是不是標記的文字。#PCDATA 必須在混合內容宣告中首先出現。
child1, child2.. 是元素,每個元素都必須在 DTD 中有其自己的定義。
如果包含子元素,則運算子 (*) 必須跟隨混合內容宣告
(#PCDATA) 和子元素宣告必須用 (|) 運算子分隔。
示例
以下是一個簡單的例子,演示了 DTD 中混合內容元素的宣告。
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>
<!DOCTYPE address [
<!ELEMENT address (#PCDATA|name)*>
<!ELEMENT name (#PCDATA)>
]>
<address>
Here's a bit of text mixed up with the child element.
<name>
Tanmay Patil
</name>
</address>
任意元素內容
您可以在內容中使用 ANY 關鍵字宣告元素。它通常被稱為混合類別元素。當您尚未確定元素的允許內容時,ANY 很有用。
語法
以下是使用 ANY 內容宣告元素的語法:
<!ELEMENT elementname ANY>
這裡,ANY 關鍵字表示文字 (PCDATA) 和/或在 DTD 中宣告的任何元素都可以在 <elementname> 元素的內容中使用。它們可以按任何順序使用任意次數。但是,ANY 關鍵字不允許您包含未在 DTD 中宣告的元素。
示例
以下是一個簡單的例子,演示了帶有 ANY 內容的元素宣告:
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?> <!DOCTYPE address [ <!ELEMENT address ANY> ]> <address> Here's a bit of sample text </address>
DTD - 屬性
在本章中,我們將討論 DTD 屬性。屬性提供有關元素的更多資訊,或者更準確地說,它定義了元素的屬性。XML 屬性始終採用名稱-值對的形式。一個元素可以具有任意數量的唯一屬性。
屬性宣告在很多方面都非常類似於元素宣告,只有一個例外;您不是為元素宣告允許的內容,而是為每個元素宣告允許的屬性列表。這些列表稱為 ATTLIST 宣告。
語法
DTD 屬性宣告的基本語法如下:
<!ATTLIST element-name attribute-name attribute-type attribute-value>
在上述語法中 -
如果元素包含屬性,則 DTD 屬性以 <!ATTLIST 關鍵字開頭。
element-name 指定屬性適用的元素的名稱。
attribute-name 指定與 element-name 一起包含的屬性的名稱。
attribute-type 定義屬性的型別。我們將在以下部分中詳細討論。
attribute-value 獲取屬性必須定義的固定值。我們將在以下部分中詳細討論。
示例
下面是 DTD 中屬性宣告的一個簡單示例:
<?xml version = "1.0"?> <!DOCTYPE address [ <!ELEMENT address ( name )> <!ELEMENT name ( #PCDATA )> <!ATTLIST name id CDATA #REQUIRED> ]> <address> <name id = "123">Tanmay Patil</name> </address>
讓我們來看一下上面的程式碼 -
以以下語句開頭的 XML 宣告:
<?xml version = "1.0"?>
緊隨 XML 頭之後是文件型別宣告,通常稱為 DOCTYPE,如下所示:
DOCTYPE 通知解析器與該 XML 文件關聯的 DTD。DOCTYPE 宣告在元素名稱的開頭有一個感嘆號 (!) 。
<!DOCTYPE address [
以下是 DTD 的主體。在這裡,我們聲明瞭元素和屬性:
<!ELEMENT address ( name )> <!ELEMENT name ( #PCDATA )>
元素 name 的屬性 id 定義如下:
這裡的屬性型別是 CDATA,其值為 #REQUIRED。
<!ATTLIST name id CDATA #REQUIRED>
屬性宣告規則
XML 文件中使用的所有屬性都必須在文件型別定義 (DTD) 中使用屬性列表宣告進行宣告
屬性只能出現在開始標記或空標記中。
關鍵字 ATTLIST 必須大寫
對於給定元素,屬性列表中不允許出現重複的屬性名稱。
屬性型別
在宣告屬性時,您可以指定處理器如何處理出現在值中的資料。我們可以將屬性型別分為三大類:
字串型別
標記化型別
列舉型別
下表提供了不同屬性型別的摘要:
| 序號 | 型別和描述 |
|---|---|
| 1 | CDATA CDATA 是字元資料(文字而不是標記)。它是一種 字串屬性型別。 |
| 2 | ID 它是屬性的唯一識別符號。它不應該出現多次。它是一種 標記化屬性型別。 |
| 3 | IDREF 它用於引用另一個元素的 ID。它用於在元素之間建立連線。它是一種 標記化屬性型別。 |
| 4 | IDREFS 它用於引用多個 ID。它是一種 標記化屬性型別。 |
| 5 | ENTITY 它表示文件中的外部實體。它是一種 標記化屬性型別。 |
| 6 | ENTITIES 它表示文件中外部實體的列表。它是一種 標記化屬性型別。 |
| 7 | NMTOKEN 它類似於 CDATA,屬性值由有效的 XML 名稱組成。它是一種 標記化屬性型別。 |
| 8 | NMTOKENS 它類似於 CDATA,屬性值由有效的 XML 名稱列表組成。它是一種 標記化屬性型別。 |
| 9 | NOTATION 元素將被引用到 DTD 文件中宣告的符號。它是一種 列舉屬性型別。 |
| 10 | 列舉 它允許定義一個特定的值列表,其中必須與其中一個值匹配。它是一種 列舉屬性型別。 |
屬性值宣告
在每個屬性宣告中,您必須指定值如何在文件中顯示。您可以指定屬性是否:
可以具有預設值
可以具有固定值
是必需的
是隱含的
預設值
它包含預設值。值可以包含在單引號 (') 或雙引號 (") 中。
語法
以下是值的語法:
<!ATTLIST element-name attribute-name attribute-type "default-value">
其中 default-value 是定義的屬性值。
示例
以下是一個帶有預設值的屬性宣告的簡單示例:
<?xml version = "1.0"?>
<!DOCTYPE address [
<!ELEMENT address ( name )>
<!ELEMENT name ( #PCDATA )>
<!ATTLIST name id CDATA "0">
]>
<address>
<name id = "123">
Tanmay Patil
</name>
</address>
在這個例子中,我們有 name 元素,其屬性 id 的預設值為 0。預設值包含在雙引號中。
固定值
當您想要指定屬性值是常量且不能更改時,使用 #FIXED 關鍵字後跟固定值。固定屬性的常見用法是指定版本號。
語法
以下是固定值的語法:
<!ATTLIST element-name attribute-name attribute-type #FIXED "value" >
其中 #FIXED 是定義的屬性值。
示例
以下是一個帶有 FIXED 值的屬性宣告的簡單示例:
<?xml version = "1.0"?> <!DOCTYPE address [ <!ELEMENT address (company)*> <!ELEMENT company (#PCDATA)> <!ATTLIST company name NMTOKEN #FIXED "tutorialspoint"> ]> <address> <company name = "tutorialspoint">we are a free online teaching faculty</company> </address>
在這個例子中,我們使用了 #FIXED 關鍵字,它表示 "tutorialspoint" 是元素 <company> 的屬性 name 的唯一值。如果我們嘗試更改屬性值,則會報錯。
以下是一個無效的 DTD:
<?xml version = "1.0"?> <!DOCTYPE address [ <!ELEMENT address (company)*> <!ELEMENT company (#PCDATA)> <!ATTLIST company name NMTOKEN #FIXED "tutorialspoint"> ]> <address> <company name = "abc">we are a free online teaching faculty</company> </address>
必需值
每當您想要指定屬性是必需時,請使用 #REQUIRED 關鍵字。
語法
以下是 #REQUIRED 的語法:
<!ATTLIST element-name attribute-name attribute-type #REQUIRED>
其中 #REQUIRED 是定義的屬性型別。
示例
以下是一個帶有 #REQUIRED 關鍵字的 DTD 屬性宣告的簡單示例:
<?xml version = "1.0"?>
<!DOCTYPE address [
<!ELEMENT address ( name )>
<!ELEMENT name ( #PCDATA )>
<!ATTLIST name id CDATA #REQUIRED>
]>
<address>
<name id = "123">
Tanmay Patil
</name>
</address>
在這個例子中,我們使用了 #REQUIRED 關鍵字來指定屬性 id 必須為元素名稱 name 提供。
隱含值
在宣告屬性時,您必須始終指定值宣告。如果要宣告的屬性沒有預設值、沒有固定值且不是必需的,則必須將該屬性宣告為 隱含。關鍵字 #IMPLIED 用於將屬性指定為 隱含。
語法
以下是 #IMPLIED 的語法:
<!ATTLIST element-name attribute-name attribute-type #IMPLIED>
其中 #IMPLIED 是定義的屬性型別。
示例
以下是一個 #IMPLIED 的簡單示例
<?xml version = "1.0"?> <!DOCTYPE address [ <!ELEMENT address ( name )> <!ELEMENT name ( #PCDATA )> <!ATTLIST name id CDATA #IMPLIED> ]> <address> <name /> </address>
在這個例子中,我們使用了 #IMPLIED 關鍵字,因為我們不想指定任何要包含在元素 name 中的屬性。它是可選的。
DTD - 實體
實體用於定義 XML 文件中特殊字元的快捷方式。實體主要可以分為四種類型:
內建實體
字元實體
通用實體
引數實體
實體宣告語法
一般來說,實體可以內部或外部宣告。讓我們瞭解一下這些以及它們的語法,如下所示:
內部實體
如果一個實體在DTD中宣告,則稱為內部實體。
語法
以下是內部實體宣告的語法:
<!ENTITY entity_name "entity_value">
在上述語法中 -
entity_name 是實體的名稱,後跟其在雙引號或單引號內的值。
entity_value 儲存實體名稱的值。
內部實體的實體值透過在實體名稱前新增字首 & 來取消引用,即 &entity_name。
示例
以下是一個內部實體宣告的簡單示例:
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?> <!DOCTYPE address [ <!ELEMENT address (#PCDATA)> <!ENTITY name "Tanmay patil"> <!ENTITY company "TutorialsPoint"> <!ENTITY phone_no "(011) 123-4567"> ]> <address> &name; &company; &phone_no; </address>
在上面的示例中,相應的實體名稱name、company和phone_no在XML文件中被其值替換。實體值透過在實體名稱前新增字首 & 來取消引用。
將此檔案儲存為sample.xml並在任何瀏覽器中開啟它,您會注意到name、company、phone_no的實體值分別被替換了。
外部實體
如果一個實體在DTD外部宣告,則稱為外部實體。您可以透過使用系統識別符號或公共識別符號來引用外部實體。
語法
以下是外部實體宣告的語法:
<!ENTITY name SYSTEM "URI/URL">
在上述語法中 -
name 是實體的名稱。
SYSTEM 是關鍵字。
URI/URL 是外部源的地址,用雙引號或單引號括起來。
型別
您可以透過以下方式引用外部DTD:
系統識別符號 - 系統識別符號使您能夠指定包含DTD宣告的外部檔案的位置。
如您所見,它包含關鍵字SYSTEM和指向文件位置的URI引用。語法如下:
<!DOCTYPE name SYSTEM "address.dtd" [...]>
公共識別符號 - 公共識別符號提供了一種定位DTD資源的機制,並按如下方式編寫:
如您所見,它以關鍵字PUBLIC開頭,後跟一個專門的識別符號。公共識別符號用於識別目錄中的條目。公共識別符號可以遵循任何格式;但是,一種常用格式稱為正式公共識別符號或FPI。
<!DOCTYPE name PUBLIC "-//Beginning XML//DTD Address Example//EN">
示例
讓我們透過以下示例瞭解外部實體:
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<!DOCTYPE address SYSTEM "address.dtd">
<address>
<name>
Tanmay Patil
</name>
<company>
TutorialsPoint
</company>
<phone>
(011) 123-4567
</phone>
</address>
以下是DTD檔案address.dtd的內容:
<!ELEMENT address (name, company, phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone (#PCDATA)>
內建實體
所有XML解析器都必須支援內建實體。通常,您可以在任何地方使用這些實體引用。您也可以在XML文件中使用普通文字,例如在元素內容和屬性值中。
有五個內建實體在格式良好的XML中發揮作用,它們是:
和號:&
單引號:'
大於號:>
小於號:<
雙引號:"
示例
以下示例演示了內建實體宣告:
<?xml version = "1.0"?> <note> <description>I'm a technical writer & programmer</description> <note>
如您所見,只要處理器遇到此字元,&字元就會被&替換。
字元實體
字元實體用於命名一些實體,這些實體是資訊的符號表示,即難以或無法鍵入的字元可以用字元實體替換。
示例
以下示例演示了字元實體宣告:
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?> <!DOCTYPE author[ <!ELEMENT author (#PCDATA)> <!ENTITY writer "Tanmay patil"> <!ENTITY copyright "©"> ]> <author>&writer;©right;</author>
您會注意到這裡我們使用了©作為版權字元的值。將此檔案儲存為sample.xml並在瀏覽器中開啟它,您將看到版權被字元©替換。
通用實體
在XML文件中使用通用實體之前,必須在DTD中宣告它們。通用實體不僅可以表示單個字元,還可以表示字元、段落,甚至整個文件。
語法
要宣告一個通用實體,請在您的DTD中使用此通用形式的宣告:
<!ENTITY ename "text">
示例
以下示例演示了通用實體宣告:
<?xml version = "1.0"?> <!DOCTYPE note [ <!ENTITY source-text "tutorialspoint"> ]> <note> &source-text; </note>
每當XML解析器遇到對source-text實體的引用時,它都會在引用的位置嚮應用程式提供替換文字。
引數實體
引數實體的目的是使您能夠建立可重用的替換文字部分。
語法
以下是引數實體宣告的語法:
<!ENTITY % ename "entity_value">
entity_value 是任何不是'&'、'%'或' " '的字元。
示例
以下示例演示了引數實體宣告。假設您有以下元素宣告:
<!ELEMENT residence (name, street, pincode, city, phone)> <!ELEMENT apartment (name, street, pincode, city, phone)> <!ELEMENT office (name, street, pincode, city, phone)> <!ELEMENT shop (name, street, pincode, city, phone)>
現在假設您想新增額外的元素country,那麼您需要將其新增到所有四個宣告中。因此,我們可以使用引數實體引用。現在使用引數實體引用,上面的示例將變為:
<!ENTITY % area "name, street, pincode, city"> <!ENTITY % contact "phone">
引數實體的取消引用方式與通用實體引用相同,只是使用百分號而不是&:
<!ELEMENT residence (%area;, %contact;)> <!ELEMENT apartment (%area;, %contact;)> <!ELEMENT office (%area;, %contact;)> <!ELEMENT shop (%area;, %contact;)>
當解析器讀取這些宣告時,它會將實體的替換文字替換為實體引用。
DTD - 驗證
我們使用DTD來精確描述XML文件。DTD根據相應XML語言的語法規則檢查XML文件的結構和詞彙的有效性。現在要檢查DTD的有效性,可以使用以下方法:
使用XML DTD驗證工具 - 您可以使用一些IDE,例如XML Spy(非免費)和XMLStarlet(開源)來驗證XML檔案相對於DTD文件的有效性。
使用XML DTD線上驗證器 - W3C標記驗證服務旨在驗證Web文件。使用線上驗證器檢查XML DTD的有效性此處。
使用XML DTD驗證API編寫您自己的XML驗證器 - JDK的新版本(1.4以上)支援XML DTD驗證API。您可以編寫自己的驗證器程式碼來檢查XML DTD驗證的有效性。