DTD -快速指南

DTD - 概述

XML 文档类型声明,通常称为 DTD,是一种精确描述 XML 语言的方式。DTD 根据相应 XML 语言的语法规则检查 XML 文档的结构和词汇的有效性。

XML 文档可以定义为 −

  • 格式良好 − 如果 XML 文档遵守所有一般 XML 规则,例如标签必须正确嵌套、开始和结束标签必须匹配以及空标签必须以 '/>' 结尾,则称其为 格式良好

  • 有效 −如果 XML 文档不仅格式正确,而且符合可用的 DTD,则该文档被视为有效,该 DTD 指定了它使用哪些标签、这些标签可以包含哪些属性以及哪些标签可以出现在其他标签内,以及其他属性。

下图表示 DTD 用于构造 XML 文档 −

类型

DTD 可以根据其在 XML 文档中的声明进行分类,例如 −

  • 内部 DTD

  • 外部 DTD

如果 DTD 在文件中声明,则称为内部 DTD,如果在单独的文件中声明,则称为外部DTD

我们将在DTD 语法

一章中详细了解这些内容

功能

以下是 DTD 描述的一些要点 −

  • 可以在 XML 文档中出现的元素。

  • 它们出现的顺序。

  • 可选和强制元素。

  • 元素属性以及它们是可选的还是强制的。

  • 属性是否可以具有默认值。

使用 DTD 的优势

  • 文档 −您可以为 XML 文件定义自己的格式。查看此文档,用户/开发人员可以了解数据的结构。

  • 验证 − 它提供了一种检查 XML 文件有效性的方法,方法是检查元素是否按正确顺序出现、必需元素和属性是否到位、元素和属性是否以错误的方式插入等。

使用 DTD 的缺点

  • 它不支持命名空间。命名空间是一种将元素和属性名称分配给组的机制。但是,在 DTD 中,必须在 DTD 内定义命名空间,这违反了使用命名空间的目的。

  • 它仅支持 文本字符串数据类型。

  • 它不是面向对象的。因此,继承的概念不能应用于 DTD。

  • 表达元素基数的可能性有限。

DTD - 语法

XML DTD 可以在文档内部指定,也可以保存在单独的文档中,然后可以将该文档链接到 DTD 文档以使用它。

语法

DTD 的基本语法如下 −

<!DOCTYPE element DTD identifier
[
   declaration1
   declaration2
   ........
]>

在上述语法中 −

  • DTD 以 <!DOCTYPE 分隔符开头。

  • element 告知解析器从指定的根元素解析文档。

  • DTD identifier 是文档类型定义的标识符,可能是系统上文件的路径或互联网上文​​件的 URL。如果 DTD 指向外部路径,则称为 外部子集

  • 方括号 [ ] 括起一个可选的实体声明列表,称为 内部子集

内部 DTD

如果元素在 XML 文件中声明,则 DTD 称为内部 DTD。要将其引用为内部 DTD,必须将 XML 声明中的 standalone 属性设置为 yes。这意味着声明独立于外部源工作。

语法

内部 DTD 的语法如下 −

<!DOCTYPE root-element [element-declarations]>

其中 root-element 是根元素的名称,element-declarations 是声明元素的位置。

示例

以下是内部 DTD 的一个简单示例 −

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>

<!DOCTYPE address [
   <!ELEMENT address (name,company,phone)>
   <!ELEMENT name (#PCDATA)>
   <!ELEMENT company (#PCDATA)>
   <!ELEMENT phone (#PCDATA)>
]>

<address>
   <name>Tanmay Patil</name>
   <company>TutorialsPoint</company>
   <phone>(011) 123-4567</phone>
</address>

让我们来看看上面的代码 −

开始声明 − 使用以下语句开始 XML 声明。

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>

DTD − 紧接着 XML 标头,紧接着是 文档类型声明,通常称为 DOCTYPE −

<!DOCTYPE address [

DOCTYPE 声明在元素名称的开头有一个感叹号 (!)。DOCTYPE 通知解析器 DTD 与此 XML 文档相关联。

DTD 主体 − DOCTYPE 声明后面是 DTD 主体,您可以在其中声明元素、属性、实体和符号 −

<!ELEMENT address (name,company,phone)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (#PCDATA)>
<!ELEMENT phone_no (#PCDATA)>

此处声明了构成 <name> 文档词汇表的几个元素。<!ELEMENT name (#PCDATA)> 将元素 name 定义为"#PCDATA"类型。此处 #PCDATA 表示可解析的文本数据。

结束声明 − 最后,使用右括号和右尖括号 (]>) 结束 DTD 的声明部分。这实际上结束了定义,此后,XML 文档紧随其后。

规则

  • 文档类型声明必须出现在文档的开头(仅在 XML 标头之前) - 不允许出现在文档内的任何其他地方。

  • 与 DOCTYPE 声明类似,元素声明必须以感叹号开头。

  • 文档类型声明中的名称必须与根元素的元素类型匹配。

外部 DTD

在外部 DTD 中,元素在 XML 文件之外声明。通过指定系统属性来访问它们,这些属性可以是合法的 .dtd 文件或有效的 URL。要将其引用为外部 DTD,必须将 XML 声明中的 standalone 属性设置为 no。这意味着,声明包含来自外部源的信息。

语法

以下是外部 DTD − 的语法

<!DOCTYPE root-element SYSTEM "file-name">

其中 file-name 是扩展名为 .dtd 的文件。

示例

以下示例显示外部 DTD 用法 −

<?xml version = "1.0" encoding = "UTF-8" standalone = "no" ?>
<!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。

系统标识符

系统标识符使您能够指定包含 DTD 声明的外部文件的位置。语法如下 −

<!DOCTYPE name SYSTEM "address.dtd" [...]>

如您所见,它包含关键字 SYSTEM 和指向文档位置的 URI 引用。

公共标识符

公共标识符提供了一种定位 DTD 资源的机制,其书写方式如下 −

<!DOCTYPE name PUBLIC "-//Beginning XML//DTD Address Example//EN">

如您所见,它以关键字 PUBLIC 开头,后跟一个专门的标识符。公共标识符用于标识目录中的条目。公共标识符可以采用任何格式,但一种常用的格式称为正式公共标识符,或 FPI

DTD - 组件

本章将从 DTD 的角度讨论 XML 组件。DTD 基本上包含以下 XML 组件的声明 −

  • 元素

  • 属性

  • 实体

元素

XML 元素可以定义为 XML 文档的构建块。元素可以充当容器来保存文本、元素、属性、媒体对象或所有这些的混合。

每个 XML 文档包含一个或多个元素,其边界由开始标记和结束标记分隔,或由空元素分隔。

示例

以下是 XML 元素的一个简单示例

<name>
   Tutorials Point
</name>

如您所见,我们定义了一个 <name> 标签。<name> 的开始和结束标签之间有一段文本。元素在 XML-DTD 中使用时需要声明,这将在 DTD 元素 一章中详细讨论。

属性

属性是 XML 元素的一部分。元素可以具有任意数量的唯一属性。属性提供有关 XML 元素的更多信息,或者更准确地说,它定义了元素的属性。 XML 属性始终是 名称-值 对。

示例

以下是 XML 属性 − 的一个简单示例

<img src = "flower.jpg"/>

此处 img 是元素名称,而 src 是属性名称,flower.jpg 是为属性 src 指定的值。

如果在 XML DTD 中使用属性,则需要声明这些属性,这将在 DTD 属性

一章中详细讨论。

实体

实体是 XML 中的占位符。可以在文档序言或 DTD 中声明这些实体。实体主要可以分为 −

  • 内置实体

  • 字符实体

  • 一般实体

  • 参数实体

在格式良好的 XML 中,有五个内置实体,它们是 −

  • &amp;

  • 单引号:&apos;

  • 大于:&gt;

  • 小于:&lt;

  • 双引号:&quot;

我们将在 XML DTD 中进一步研究实体声明详细信息请参阅DTD 实体一章

DTD - 元素

XML 元素可以定义为 XML 文档的构建块。元素可以充当容器,用于保存文本、元素、属性、媒体对象或所有这些的混合。

DTD 元素通过 ELEMENT 声明进行声明。当 XML 文件通过 DTD 进行验证时,解析器首先检查根元素,然后验证子元素。

语法

所有 DTD 元素声明都具有此通用形式 −

<!ELEMENT elementname (content)>
  • ELEMENT 声明用于向解析器指示您即将定义一个元素。

  • elementname 是您正在定义的元素名称(也称为通用标识符)。

  • content 定义元素内可以包含哪些内容(如果有)。

元素内容类型

DTD 中元素声明的内容可分为以下类别 −

  • 空内容

  • 元素内容

  • 混合内容

  • 任何内容

空内容

这是元素声明的一个特殊情况。此元素声明不包含任何内容。这些内容用关键字 EMPTY 声明。

语法

以下是空元素声明 − 的语法

<!ELEMENT elementname EMPTY >

在上述语法中 −

  • ELEMENT 是类别 EMPTY

  • 的元素声明
  • elementname 是空元素的名称。

示例

以下是演示空元素声明的简单示例 −

<?xml version = "1.0"?>

<!DOCTYPE hr[
   <!ELEMENT address EMPTY>    
]>
<address />

在此示例中,address 被声明为空元素。address 元素的标记将显示为 <address />。

元素内容

在带有元素内容的元素声明中,内容将是括号内的允许元素。我们还可以包含多个元素。

语法

以下是带有元素内容 − 的元素声明的语法

<!ELEMENT elementname (child1, child2...)>
  • ELEMENT 是元素声明标签

  • elementname 是元素的名称。

  • child1、child2.. 是元素,每个元素在 DTD 中都必须有自己的定义。

示例

以下示例演示了带有元素内容的元素声明的简单示例 −

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>

<!DOCTYPE address [
   <!ELEMENT address (name,company,phone)>
   <!ELEMENT name (#PCDATA)>
   <!ELEMENT company (#PCDATA)>
   <!ELEMENT phone (#PCDATA)>
]>

<address>
   <name>Tanmay Patil</name>
   <company>TutorialsPoint</company>
   <phone>(011) 123-4567</phone>
</address>

在上面的例子中,address是父元素,namecompanyphone_no是其子元素。

运算符和语法规则列表

下表显示了可用于定义子元素 − 的运算符和语法规则列表。

运算符 语法 描述 示例
+ <!ELEMENT element-name (child1+)> 表示子元素可以在父元素中出现一次或多次。

<!ELEMENT address (name+)>

子元素 name 可以在元素名称 address 中出现一次或多次。

* <!ELEMENT element-name (child1*)> 表示子元素可以出现零次或更多次出现在父元素内。

<!ELEMENT address (name*)>

子元素 name 可以在元素名称 address 内出现零次或更多次。

p>
? <!ELEMENT element-name (child1?)> 它表示子元素可以在父元素中出现零次或一次。

<!ELEMENT address (name?)>

子元素 name 可以在元素名称 address 中出现零次或一次。

, <!ELEMENT element-name (child1, child2)> 它给出以逗号分隔的子元素序列,这些子元素必须包含在 element-name 中。

<!ELEMENT address (name, company)>

子元素 namecompany 的序列,它们必须在元素名称中以相同的顺序出现元素名称 address

| <!ELEMENT element-name (child1 | child2)> 它允许在子元素中进行选择。

<!ELEMENT address (name | company)>

它允许您选择子元素,即 namecompany,它们必须出现在元素名称 address 内。

规则

如果元素内容不止一个,我们需要遵循某些规则 −

  • 序列 − 通常,DTD 文档中的元素必须以不同的顺序出现。如果是这种情况,则使用序列定义内容。

    声明表明 <address> 元素必须恰好有三个子元素 - <name>、<company> 和 <phone> - 并且它们必须按此顺序出现。例如 −

<!ELEMENT address (name,company,phone)>
  • 选择 −假设您需要允许一个元素或另一个元素,但不能同时允许两者。在这种情况下,您必须使用竖线 (|) 字符。竖线用作排他或。例如 −

<!ELEMENT address (mobile | landline)>

混合元素内容

这是 (#PCDATA) 和子元素的组合。PCDATA 代表解析的字符数据,即非标记的文本。在混合内容模型中,文本可以单独出现,也可以散布在元素之间。混合内容模型的规则类似于上一节中讨论的元素内容。

语法

以下是混合元素内容的通用语法 −

<!ELEMENT elementname (#PCDATA|child1|child2)*>
  • ELEMENT 是元素声明标记。

  • elementname 是元素的名称。

  • PCDATA 是非标记的文本。#PCDATA 必须在混合内容声明中排在第一位。

  • child1、child2.. 是元素,每个元素在 DTD 中都必须有自己的定义。

  • 如果包含子元素,则运算符 (*) 必须跟在混合内容声明之后

  • (#PCDATA) 和子元素声明必须由 (|) 运算符分隔。

示例

以下是一个简单的示例,演示了 DTD 中的混合内容元素声明。

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>

<!DOCTYPE address [
   <!ELEMENT address (#PCDATA|name)*>
   <!ELEMENT name (#PCDATA)>
]>

<address>
   Here's a bit of text mixed up with the child element.
   <name>
      Tanmay Patil
   </name>
</address>

ANY 元素内容

您可以在内容中使用 ANY 关键字声明元素。它通常被称为混合类别元素。当您尚未决定元素的允许内容时,ANY 很有用。

语法

以下是使用 ANY 内容声明元素的语法 −

<!ELEMENT elementname ANY>

此处,ANY 关键字表示文本 (PCDATA) 和/或 DTD 中声明的任何元素都可以在 <elementname> 元素的内容中使用。它们可以按任意顺序使用任意次数。但是,ANY 关键字不允许您包含未在​​ DTD 中声明的元素。

示例

以下是一个简单的示例,演示了使用 ANY 内容的元素声明 −

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>

<!DOCTYPE address [
   <!ELEMENT address ANY>
]>

<address>
   Here's a bit of sample text
</address>

DTD - 属性

在本章中,我们将讨论 DTD 属性。属性提供有关元素的更多信息,或者更准确地说,它定义了元素的属性。XML 属性始终采用名称-值对的形式。元素可以具有任意数量的唯一属性。

属性声明在很多方面与元素声明非常相似,除了一点之外;您不是为元素声明允许的内容,而是为每个元素声明一个允许的属性列表。这些列表称为 ATTLIST 声明。

语法

DTD 属性声明的基本语法如下 −

<!ATTLIST element-name attribute-name attribute-type attribute-value>

在上述语法中 −

  • 如果元素包含属性,则 DTD 属性以 <!ATTLIST 关键字开头。

  • element-name 指定属性适用的元素的名称。

  • attribute-name 指定包含在 element-name 中的属性的名称。

  • attribute-type 定义属性的类型。我们将在以下部分中对此进行更多讨论。

  • attribute-value 采用属性必须定义的固定值。我们将在以下部分中对此进行更多讨论。

示例

以下是 DTD 中属性声明的一个简单示例 −

<?xml version = "1.0"?>

<!DOCTYPE address [
   <!ELEMENT address ( name )>
   <!ELEMENT name ( #PCDATA )>
   <!ATTLIST name id CDATA #REQUIRED>
]>

<address>
   <name id = "123">Tanmay Patil</name>
</address>

让我们来看看上面的代码 −

  • 从 XML 声明开始,使用以下语句 −

<?xml version = "1.0"?>
  • 紧接着 XML 标头的是文档类型声明,通常称为 DOCTYPE,如下所示 −

    DOCTYPE 通知解析器 DTD 与此 XML 文档相关联。DOCTYPE 声明在元素名称的开头有一个感叹号 (!)。

<!DOCTYPE address [
  • 以下是 DTD 的主体。这里我们声明了元素和属性 −

<!ELEMENT address ( name )>
<!ELEMENT name ( #PCDATA )>
  • 元素 name 的属性 id 定义如下 −

    此处的属性类型为 CDATA,其值为 #REQUIRED

<!ATTLIST name id CDATA #REQUIRED>

属性声明规则

  • XML 文档中使用的所有属性都必须使用属性列表声明在文档类型定义 (DTD) 中声明

  • 属性只能出现在开始或空标记中。

  • 关键字 ATTLIST 必须大写

  • 给定元素的属性列表中不允许有重复的属性名称。

属性类型

声明属性时,您可以指定处理器应如何处理值中出现的数据。我们可以将属性类型分为三大类 −

  • 字符串类型

  • 标记类型

  • 枚举类型

下表总结了不同的属性类型 −

Sr.No. Type & Description
1

CDATA

CDATA 是字符数据(文本而非标记)。它是 字符串属性类型

2

ID

它是属性的唯一标识符。它不应出现多次。它是 标记化属性类型

3

IDREF

它用于引用另一个元素的 ID。它用于在元素之间建立连接。它是一个标记化属性类型

4

IDREFS

它用于引用多个 ID。它是一个标记化属性类型

5

ENTITY

它表示文档中的外部实体。它是一个标记化属性类型

6

ENTITIES

它表示文档中的外部实体列表。它是一个标记化属性类型

7

NMTOKEN

它类似于 CDATA,属性值由有效的 XML 名称组成。它是一个标记化属性类型

8

NMTOKENS

它类似于 CDATA,属性值由有效 XML 名称列表组成。它是一个标记化属性类型

9

NOTATION

元素将引用 DTD 文档中声明的符号。它是一个枚举属性类型

10

Enumeration

它允许定义一个特定的值列表,其中一个值必须匹配。它是一个枚举属性类型

属性值声明

在每个属性声明中,您必须指定值在文档中的显示方式。您可以指定属性是否为 −

  • 可以有默认值

  • 可以有固定值

  • 是必需的

  • 是隐含的

默认值

它包含默认值。值可以用单引号(')或双引号(")括起来。

语法

以下是值 − 的语法

<!ATTLIST element-name attribute-name attribute-type "default-value">

其中 default-value 是定义的属性值。

示例

以下是使用默认值声明属性的简单示例 −

<?xml version = "1.0"?>

<!DOCTYPE address [
   <!ELEMENT address ( name )>
   <!ELEMENT name ( #PCDATA )>
   <!ATTLIST name id CDATA "0">
]>

<address>
   <name id = "123">
      Tanmay Patil
   </name>
</address>

在此示例中,我们有一个 name 元素,其属性 id 的默认值为 0。默认值被括在双引号中。

固定值

当您想要指定属性值是常量且无法更改时,使用 #FIXED 关键字后跟固定值。固定属性的常见用途是指定版本号。

语法

以下是固定值 − 的语法

<!ATTLIST element-name attribute-name attribute-type #FIXED "value" >

其中 #FIXED 是定义的属性值。

示例

以下是使用 FIXED 值声明属性的简单示例 −

<?xml version = "1.0"?>

<!DOCTYPE address [
  <!ELEMENT address (company)*>
  <!ELEMENT company (#PCDATA)>
  <!ATTLIST company name NMTOKEN #FIXED "tutorialspoint">
]>

<address>
  <company name = "tutorialspoint">we are a free online teaching faculty</company>
</address>

在此示例中,我们使用了关键字 #FIXED,它表示值"tutorialspoint"是元素 <company> 的属性 name 的唯一值。如果我们尝试更改属性值,则会出现错误。

以下是无效的 DTD −

<?xml version = "1.0"?>

<!DOCTYPE address [
  <!ELEMENT address (company)*>
  <!ELEMENT company (#PCDATA)>
  <!ATTLIST company name NMTOKEN #FIXED "tutorialspoint">
]>

<address>
  <company name = "abc">we are a free online teaching faculty</company>
</address>

必需值

每当您想要指定某个属性是必需的时,请使用 #REQUIRED 关键字。

语法

以下是 #REQUIRED 的语法 −

<!ATTLIST element-name attribute-name attribute-type #REQUIRED>

其中 #REQUIRED 是定义的属性类型。

示例

以下是使用 #REQUIRED 关键字声明 DTD 属性的简单示例 −

<?xml version = "1.0"?>

<!DOCTYPE address [
   <!ELEMENT address ( name )>
   <!ELEMENT name ( #PCDATA )>
   <!ATTLIST name id CDATA #REQUIRED>
]>

<address>
   <name id = "123">
      Tanmay Patil
   </name>
</address>

在此示例中,我们使用了 #REQUIRED 关键字来指定必须为元素名称 name 提供属性 id

IMPLIED 值

声明属性时,必须始终指定值声明。如果您声明的属性没有默认值、没有固定值且不是必需的,则必须将该属性声明为 implied。关键字 #IMPLIED 用于将属性指定为 implied

语法

以下是 #IMPLIED − 的语法

<!ATTLIST element-name attribute-name attribute-type #IMPLIED>

其中 #IMPLIED 是定义的属性类型。

示例

以下是 #IMPLIED 的一个简单示例

<?xml version = "1.0"?>

<!DOCTYPE address [
   <!ELEMENT address ( name )>
   <!ELEMENT name ( #PCDATA )>
   <!ATTLIST name id CDATA #IMPLIED>
]>

<address>
   <name />
</address>

在此示例中,我们使用了关键字 #IMPLIED,因为我们不想指定任何要包含在元素 name 中的属性。它是可选的。

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

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

DTD - 验证

我们使用 DTD 来精确描述 XML 文档。DTD 根据相应 XML 语言的语法规则检查 XML 文档的结构和词汇的有效性。现在,要检查 DTD 的有效性,可以使用以下步骤 −

  • 使用 XML DTD 验证工具 − 您可以使用一些 IDE,例如 XML Spy(非免费)和 XMLStarlet(开源)来根据 DTD 文档验证 XML 文件。

  • 使用 XML DTD 在线验证器 − W3C 标记验证服务旨在验证 Web 文档。使用在线验证器检查您的 XML DTD 的有效性此处

  • 使用 XML DTD 验证 API 编写您自己的 XML 验证器 − 较新版本的 JDK(1.4 以上)支持 XML DTD 验证 API。您可以编写自己的验证器代码来检查 XML DTD 验证的有效性。