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 中發揮作用,它們是 -

  • 和號:&amp;

  • 單引號:&apos;

  • 大於號:&gt;

  • 小於號:&lt;

  • 雙引號:&quot;

我們將在章節DTD 實體中詳細研究 XML DTD 中的實體宣告。

DTD - 元素

XML 元素可以定義為 XML 文件的構建塊。元素可以充當容器,用於儲存文字、元素、屬性、媒體物件或所有這些的混合。

DTD 元素透過 ELEMENT 宣告進行宣告。當 XML 檔案由 DTD 驗證時,解析器首先檢查根元素,然後驗證子元素。

語法

所有 DTD 元素宣告都具有以下通用形式 -

<!ELEMENT elementname (content)>
  • ELEMENT宣告用於指示解析器您即將定義一個元素。

  • elementname是您要定義的元素名稱(也稱為通用識別符號)。

  • content定義元素內部可以包含哪些內容(如果有)。

元素內容型別

DTD 中元素宣告的內容可以分類如下 -

  • 空內容

  • 元素內容

  • 混合內容

  • 任何內容

空內容

這是元素宣告的一種特殊情況。此元素宣告不包含任何內容。這些使用關鍵字EMPTY宣告。

語法

以下是空元素宣告的語法 -

<!ELEMENT elementname EMPTY >

在上述語法中 -

  • ELEMENTEMPTY類別的元素宣告

  • 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 是父元素,namecompanyphone_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)>

子元素 namecompany 的順序,必須按相同的順序出現在元素名稱 address 內部。

| <!ELEMENT element-name (child1 | child2)> 它允許在子元素中進行選擇。

<!ELEMENT address (name | company)>

它允許您選擇任一子元素,即 namecompany,它們必須出現在元素名稱 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>

在上面的示例中,相應的實體名稱namecompanyphone_no在XML文件中被其值替換。實體值透過在實體名稱前新增字首 & 來取消引用。

將此檔案儲存為sample.xml並在任何瀏覽器中開啟它,您會注意到namecompanyphone_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中發揮作用,它們是:

  • 和號:&amp;

  • 單引號:&apos;

  • 大於號:&gt;

  • 小於號:&lt;

  • 雙引號:&quot;

示例

以下示例演示了內建實體宣告:

<?xml version = "1.0"?>

<note>
   <description>I'm a technical writer & programmer</description>
<note>

如您所見,只要處理器遇到此字元,&amp;字元就會被&替換。

字元實體

字元實體用於命名一些實體,這些實體是資訊的符號表示,即難以或無法鍵入的字元可以用字元實體替換。

示例

以下示例演示了字元實體宣告:

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<!DOCTYPE author[
   <!ELEMENT author (#PCDATA)>
   <!ENTITY writer "Tanmay patil">
   <!ENTITY copyright "&#169;">
]>
<author>&writer;&copyright;</author>

您會注意到這裡我們使用了&#169;作為版權字元的值。將此檔案儲存為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驗證的有效性。

廣告

© . All rights reserved.