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>

在上面的示例中,各个实体名称 - namecompanyphone_no由它们在XML文档中的值替换。 通过向实体名称添加前缀&来取消引用实体值。

将此文件另存为sample.xml,并在浏览器中打开它,注意可以看到:namecompanyphone_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中发挥作用,它们分别是 -

  • &符号:&amp;
  • 单引号:&apos;
  • 大于号:&gt;
  • 小于号:&lt;
  • 双引号:&quot;

示例

以下示例演示了内置实体声明 -

<?xml version = 1.0?>

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

在这里看到&amp; 只要处理器遇到此问题,就会用&替换字符。

3. 字符实体

字符实体用于命名一些作为信息的符号表示的实体,即难以或不可能键入的字符可以由字符实体代替。

示例

以下示例演示了字符实体声明 -

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

注意到使用©作为版权特征的值。 将此文件另存为sample.xml并在浏览器中打开它,将看到版权被字符©替换。

4. 常规实体

需要先在DTD中声明常规实体,然后才能在XML文档中使用它们。 常规实体可以表示字符,段落甚至整个文档,而不是仅表示单个字符。

语法

要声明常规实体,请在DTD中使用此一般形式的声明 -

<!ENTITY ename text>

示例

以下示例演示了常规实体声明 -

<?xml version = 1.0?>

<!DOCTYPE note [
   <!ENTITY source-text jb51-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;)>

当解析器读取这些声明时,它会将实体的替换文本替换为实体引用。