DTD - 快速指南


DTD - 概述

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

XML 文档可以定义为 -

  • 格式良好- 如果 XML 文档遵守所有通用 XML 规则,例如标签必须正确嵌套、开始和结束标签必须平衡、空标签必须以“/>”结尾,则称为格式良好

    或者

  • 有效- 当 XML 文档不仅格式良好,而且还符合可用的 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 分隔符开头。

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

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

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

内部DTD

如果元素是在 XML 文件中声明的,则 DTD 称为内部 DTD。要将其作为内部 DTD 引用, XML 声明中的独立属性必须设置为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)> 将元素名称定义为“#PCDATA”类型。这里#PCDATA 表示可解析的文本数据。

结束声明- 最后,DTD 的声明部分使用右括号和右尖括号 (]>) 结束。这实际上结束了定义,之后紧接着是 XML 文档。

规则

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

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

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

外部DTD

在外部 DTD 中,元素在 XML 文件外部声明。通过指定系统属性来访问它们,这些属性可以是合法的.dtd文件或有效的 URL。要将其作为外部 DTD 引用, XML 声明中的独立属性必须设置为 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 中发挥作用,它们是 -

  • 和符号:&

  • 单引号:’

  • 大于:>

  • 小于:<

  • 双引号:"

我们将在DTD 实体一章中详细研究 XML DTD 中的实体声明

DTD - 元素

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

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

句法

所有 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 />。

元素内容

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

句法

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

<!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 元素名称 (child1+)> 它表示子元素可以在父元素中出现一次或多次。

<!ELEMENT 地址(名称+)>

子元素名称可以在元素名称地址内出现一次或多次。

* <!ELEMENT 元素名称 (child1*)> 它表示子元素可以在父元素中出现零次或多次。

<!ELEMENT 地址(名称*)>

子元素名称可以在元素名称地址内出现零次或多次。

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

<!ELEMENT 地址(名称?)>

子元素名称可以在元素名称地址内出现零次或一次。

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

<!ELEMENT 地址(姓名、公司)>

子元素名称公司的序列,它们必须以相同的顺序出现在元素名称地址内。

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

<!ELEMENT 地址(名称 | 公司)>

它允许您选择子元素,即名称公司,它们必须出现在元素名称地址内。

规则

如果有多个元素内容,我们需要遵循一定的规则 -

  • 序列- 通常,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 很有用。

句法

以下是声明具有任何内容的元素的语法 -

<!ELEMENT elementname ANY>

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

例子

以下是一个简单的示例,演示了具有任何内容的元素声明 -

<?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指定元素名称中包含的属性的名称。

  • 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 )>
  • 元素名称的属性id定义如下 -

    这里属性类型是CDATA,其值是#REQUIRED

<!ATTLIST name id CDATA #REQUIRED>

属性声明规则

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

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

  • 关键字 ATTLIST 必须大写

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

属性类型

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

  • 字符串类型

  • 标记化类型

  • 枚举类型

下表提供了不同属性类型的摘要 -

先生。 类型和描述
1

数据中心

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

2

ID

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

3

ID参考

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

4

IDREFS

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

5

实体

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

6

实体

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

7

NMT令牌

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

8

NMT代币

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

9

符号

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

10

枚举

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

属性值声明

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

  • 可以有一个默认值

  • 可以有一个固定值

  • 是必须的

  • 是暗示的

默认值

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

句法

以下是值的语法 -

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

在此示例中,我们有带有属性id 的name元素,其默认值为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> 的属性名称的唯一。如果我们尝试更改属性值,则会出现错误。

以下是无效的 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关键字来指定必须为元素名称名称提供属性id

隐含值

声明属性时,您必须始终指定值声明。如果您声明的属性没有默认值、没有固定值并且不是必需的,那么您必须将该属性声明为隐含。关键字#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,因为我们不想指定元素名称中包含的任何属性。它是可选的。

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 文档中的值替换。通过在实体名称中添加前缀&来取消引用实体值。

将此文件保存为example.xml并在任何浏览器中打开它,您会注意到namecompanyPhone_no的实体值分别被替换。

外部实体

如果实体在 DTD 之外声明,则称为外部实体。您可以使用系统标识符或公共标识符来引用外部实体。

句法

以下是外部实体声明的语法 -

<!ENTITY name SYSTEM "URI/URL">

在上面的语法中 -

  • name是实体的名称。

  • 系统是关键字。

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

  • 和符号:&

  • 单引号:’

  • 大于:>

  • 小于:<

  • 双引号:"

例子

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

<?xml version = "1.0"?>

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

正如您在这里看到的 & 每当处理器遇到此字符时,字符就会被 & 替换。

字符实体

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

例子

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

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

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

一般实体

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

句法

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

<!ENTITY ename "text">

例子

以下示例演示了一般实体声明 -

<?xml version = "1.0"?>

<!DOCTYPE note [
   <!ENTITY source-text "tutorialspoint">
]>

<note>
   &source-text;
</note>

每当 XML 解析器遇到对源文本实体的引用时,它就会在引用点向应用程序提供替换文本。

参数实体

参数实体的目的是使您能够创建替换文本的可重用部分。

句法

以下是参数实体声明的语法 -

<!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 验证的有效性。