原文:DTD - Entities

  实体用于定义XML文档中特殊字符的快捷方式。 实体主要有四种类型:

  • 内置实体(Built-in entities)
  • 字符实体(Character entities)
  • 通用实体(General entities)
  • 参数实体(Parameter entities)

实体声明语法

  一般而言,实体可以被声明为内部的和外部的。让我们先来了解一下概念和语法:

内部实体

  如果一个实体是在一个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>

  在上面的例子中,实体名称name、company、phone_no都会被XML文档中相应的值所替换。实体值的引用是在实体名字前加'&'。

  将上面的内容保存为sample.xml,用浏览器打开,你就可以看到name、company、phone_no的值都会相应的被替换掉。

【译】DTD - Entities-LMLPHP

外部实体

  如果一个实体是声明在DTD的外面就称之为外部实体。你可以使用系统标识符或公共标识符来引用外部实体。

语法

  外部实体的声明语法如下:

<!ENTITY name SYSTEM "URI/URL">

  如上的语法中:

  • name:实体名。
  • SYSTEM:声明为外部实体关键字。
  • URI/URL:双引号或单引号括起来的就是外部资源的地址。

类型

  可以通过如下的方法来引用一个外部实体:

  • 系统标识符:系统标识符可以指定包含DTD声明的外部文件的位置。使用语法如下:
<!DOCTYPE name SYSTEM "address.dtd" [...]>

  正如你所见,包含了SYSTEM关键字和指向文件位置的URI引用。

  • 公共标识符:提供了一个定位DTD资源的机制,写法如下:
<!DOCTYPE name PUBLIC "-//Beginning XML//DTD Address Example//EN">

  正如你所见,以关键字PUBLIC开头,接着是一个特殊的标识符。公共标识符用于标识目录中的项。公共标识符可以遵循任何格式; 然而,常用的格式称为正式公共标识符或FPI。

例子

  我们先通过下面这个例子来理解一下外部实体:

<?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)>

【译】DTD - Entities-LMLPHP

内置实体

  所有的XML解析器都必须支持内置实体。一般来讲,你可以在任何地方引用这些实体(内置实体)。你也可以在XML文档中使用普通文本,例如元素内容和属性值。

  在格式良好的XML文件中共有五种内置实体扮演着它们的角色,它们分别是:

实体引用	     字符
&lt;		<
&gt;		>
&amp;		&
&quot;		"
&apos;		'

例子

  下面的例子展示了内置实体声明:

<?xml version="1.0"?>
<note>
	<description>I'm a technical writer &amp; programmer</description>
</note>

【译】DTD - Entities-LMLPHP

  正如你所见,每当处理器遇到&amp; 字符,就将其替换为&。

字符实体

  字符实体用于命名一些信息符号表示的实体, 也即是一些难以或不可输入的字符可以用字符实体来代替。

例子

  下面的例子展示了字符实体的声明:

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

  注意到这里我们用©来代替版权字符。将文件内容保存为sample4.xml,然后用浏览器打开, 你就会看到版权字符被©所替换。[代码里的被自动替换了]

【译】DTD - Entities-LMLPHP通用实体

  通用实体必须要在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)>

  现在你想额外增加一个元素contact, 之后你就必须分别在四个声明中加上这个元素。因此,我们可以使用参数实体引用。上面的例子中,使用参数实体引用会像下面这样:

<!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;)>

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

【注】英文原文中有些许笔误,country->contact, 不过不影响文章阅读,如果发现翻译的文章有错误的地方,欢迎指出,谢谢!

05-11 15:39
查看更多