DTD實體
實體是用於定義XML文檔中特殊字符的快捷方式。 實體主要有四種類型 -
- 內置實體
- 字符實體
- 常規實體
- 參數實體
1. 實體聲明語法
通常,實體可以在內部或外部聲明。 讓我們瞭解以下各項及其語法如下 -
1.1. 內部實體
如果在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 "Max su">
<!ENTITY company "Yiibai">
<!ENTITY phone_no "(086) 123-4567890">
]>
<address>
&name;
&company;
&phone_no;
</address>
在上面的示例中,各個實體名稱 - name
,company
和phone_no
由它們在XML文檔中的值替換。 通過向實體名稱添加前綴&
來取消引用實體值。
將此文件另存爲sample.xml,並在瀏覽器中打開它,注意可以看到:name
,company
,phone_no
的實體值都被替換。
1.2. 外部實體
如果在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>
Max Su
</name>
<company>
Yiibai Yiibai
</company>
<phone>
(086) 123-4567890
</phone>
</address>
以下是DTD文件address.dtd 的內容 -
<!ELEMENT address (name, company, phone)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (#PCDATA)>
<!ELEMENT phone (#PCDATA)>
2. 內置實體
所有XML解析器都必須支持內置實體。 通常,可以在任何地方使用這些實體引用。 還可以在XML文檔中使用普通文本,例如 - 元素內容和屬性值。
有五個內置實體在格式良好的XML中發揮作用,它們分別是 -
-
&
符號:&
- 單引號:
'
- 大於號:
>
- 小於號:
<
- 雙引號:
"
示例
以下示例演示了內置實體聲明 -
<?xml version = "1.0"?>
<note>
<description>I'm a technical writer & programmer</description>
<note>
在這裏看到&
只要處理器遇到此問題,就會用&
替換字符。
3. 字符實體
字符實體用於命名一些作爲信息的符號表示的實體,即難以或不可能鍵入的字符可以由字符實體代替。
示例
以下示例演示了字符實體聲明 -
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<!DOCTYPE author[
<!ELEMENT author (#PCDATA)>
<!ENTITY writer "Max Su">
<!ENTITY copyright "©">
]>
<author>&writer;©right;</author>
注意到使用©
作爲版權特徵的值。 將此文件另存爲sample.xml
並在瀏覽器中打開它,將看到版權被字符©
替換。
4. 常規實體
需要先在DTD中聲明常規實體,然後才能在XML文檔中使用它們。 常規實體可以表示字符,段落甚至整個文檔,而不是僅表示單個字符。
語法
要聲明常規實體,請在DTD中使用此一般形式的聲明 -
<!ENTITY ename "text">
示例
以下示例演示了常規實體聲明 -
<?xml version = "1.0"?>
<!DOCTYPE note [
<!ENTITY source-text "yiibai-tutorials">
]>
<note>
&source-text;
</note>
每當XML解析器遇到對源文本實體的引用時,它在引用時將替換文本提供給應用程序。
5. 參數實體
參數實體的目的是能夠創建替換文本的可重用部分。
語法
以下是參數實體聲明的語法 -
<!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;)>
當解析器讀取這些聲明時,它會將實體的替換文本替換爲實體引用。