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 中发挥作用,它们是 −

  • &ersand:&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,并在浏览器中打开,您会看到版权被字符 © 替换。

一般实体

一般实体必须在 DTD 中声明,然后才能在 XML 文档中使用。一般实体不仅可以表示单个字符,还可以表示字符、段落甚至整个文档。

语法

要声明一般实体,请在 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;)>

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