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;)>
当解析器读取这些声明时,它会将实体的替换文本替换为实体引用。