Skip to content

DTD 实体

DTD 实体(Entities):定义快捷方式

Section titled “DTD 实体(Entities):定义快捷方式”

DTD 中的实体就像变量或宏,用于为常用文本或特殊字符定义快捷方式。

它们有助于提高可维护性(只需在一个地方更改值)和可读性。

实体可以在 DTD 内部声明,也可以在单独的文件中外部声明。

  • &lt; 代表 < (小于号)
  • &gt; 代表 > (大于号)
  • &amp; 代表 & (与号)
  • &quot; 代表 " (双引号)
  • &apos; 代表 ' (单引号/撇号)

当你需要在元素内容或属性值中包含这些字符的字面量文本,而不是让它们被解释为标记时,通常会使用这些预定义实体。

内部实体在 DTD 中直接将一个名称与一个替换文本字符串关联起来。

`<!ENTITY entity-name "replacement text">`

DTD 声明(可以是内部的,也可以是外部 DTD 文件的一部分):

<!ENTITY writer "John Doe">
<!ENTITY copyright "Copyright (C) 2024 Example Inc.">
<!ENTITY company "Example Inc.">

XML 使用:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE document [
<!ELEMENT document (author, notice)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT notice (#PCDATA)>
<!ENTITY writer "John Doe">
<!ENTITY copyright "Copyright (C) 2024 Example Inc.">
]>
<document>
<author>Written by &writer;.</author>
<notice>&copyright;</notice>
</document>

解析时,&writer; 将被替换为 “John Doe”,&copyright; 将被替换为 “Copyright (C) 2024 Example Inc.”

注意:实体引用由一个与号(&)、实体名称和一个分号(;)组成。

外部实体将一个名称与位于外部资源(通常是一个文件)中的内容关联起来。

`<!ENTITY entity-name SYSTEM "URI/URL">`

假设你有一个 footer.xml 文件,其中包含:

<legal>All rights reserved by Example Inc. Use is subject to license terms.</legal>

DTD 声明:

<!ENTITY footerContent SYSTEM "footer.xml">

XML 使用:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE report [
<!ELEMENT report (title, content, footer)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT content (#PCDATA)>
<!ELEMENT footer ANY> <!-- Define footer element -->
<!ENTITY footerContent SYSTEM "footer.xml"> <!-- Declare external entity -->
]>
<report>
<title>Annual Report</title>
<content>This year's performance was strong...</content>
<footer>&footerContent;</footer> <!-- Reference the external entity -->
</report>

当 XML 解析器处理此文档时,它将获取 footer.xml 的内容并将其插入到 &footerContent; 出现的位置。请注意,如果解析器配置不安全,特别是处理不受信任的 XML 文档时,外部实体可能带来安全风险(例如,XML 外部实体 - XXE 攻击)。现代解析器通常默认禁用外部实体处理。