- DTD 有用资源
- DTD - 快速指南
- DTD - 有用资源
DTD - 快速指南
DTD - 概述
XML 文档类型声明,通常称为 DTD,是一种精确描述 XML 语言的方法。DTD 检查 XML 文档的结构和词汇是否符合相应 XML 语言的语法规则。
XML 文档可以定义为 -
良构 - 如果 XML 文档遵循所有通用 XML 规则,例如标签必须正确嵌套,开始和结束标签必须平衡,空标签必须以 '/>' 结尾,则称为良构。
或
有效 - 当 XML 文档不仅良构,而且还符合可用的 DTD 时,该 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 声明中的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 通知解析器与该 XML 文档关联的 DTD。
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 声明,元素声明必须以感叹号开头。
文档类型声明中的 Name 必须与根元素的元素类型匹配。
外部 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 中发挥作用,它们是 -
和号:&
单引号:'
大于号:>
小于号:<
双引号:"
我们将在章节DTD 实体中详细研究 XML 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 是父元素,name、company 和 phone_no 是它的子元素。
操作符和语法规则列表
下表显示了可以在定义子元素时应用的操作符和语法规则:
操作符 | 语法 | 描述 | 示例 |
---|---|---|---|
+ | <!ELEMENT element-name (child1+)> | 它表示子元素可以在父元素内部出现一次或多次。 | <!ELEMENT address (name+)> 子元素 name 可以在元素名称 address 内部出现一次或多次。 |
* | <!ELEMENT element-name (child1*)> | 它表示子元素可以在父元素内部出现零次或多次。 | <!ELEMENT address (name*)> 子元素 name 可以在元素名称 address 内部出现零次或多次。 |
? | <!ELEMENT element-name (child1?)> | 它表示子元素可以在父元素内部出现零次或一次。 | <!ELEMENT address (name?)> 子元素 name 可以在元素名称 address 内部出现零次或一次。 |
, | <!ELEMENT element-name (child1, child2)> | 它给出了用逗号分隔的子元素序列,这些子元素必须包含在 element-name 中。 | <!ELEMENT address (name, company)> 子元素 name、company 的顺序,必须按相同的顺序出现在元素名称 address 内部。 |
| | <!ELEMENT element-name (child1 | child2)> | 它允许在子元素中进行选择。 | <!ELEMENT address (name | company)> 它允许您选择任一子元素,即 name 或 company,它们必须出现在元素名称 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 内容声明元素的语法:
<!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 通知解析器与该 XML 文档关联的 DTD。DOCTYPE 声明在元素名称的开头有一个感叹号 (!) 。
<!DOCTYPE address [
以下是 DTD 的主体。在这里,我们声明了元素和属性:
<!ELEMENT address ( name )> <!ELEMENT name ( #PCDATA )>
元素 name 的属性 id 定义如下:
这里的属性类型是 CDATA,其值为 #REQUIRED。
<!ATTLIST name id CDATA #REQUIRED>
属性声明规则
XML 文档中使用的所有属性都必须在文档类型定义 (DTD) 中使用属性列表声明进行声明
属性只能出现在开始标记或空标记中。
关键字 ATTLIST 必须大写
对于给定元素,属性列表中不允许出现重复的属性名称。
属性类型
在声明属性时,您可以指定处理器如何处理出现在值中的数据。我们可以将属性类型分为三大类:
字符串类型
标记化类型
枚举类型
下表提供了不同属性类型的摘要:
序号 | 类型和描述 |
---|---|
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 | 枚举 它允许定义一个特定的值列表,其中必须与其中一个值匹配。它是一种 枚举属性类型。 |
属性值声明
在每个属性声明中,您必须指定值如何在文档中显示。您可以指定属性是否:
可以具有默认值
可以具有固定值
是必需的
是隐含的
默认值
它包含默认值。值可以包含在单引号 (') 或双引号 (") 中。
语法
以下是值的语法:
<!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 关键字来指定属性 id 必须为元素名称 name 提供。
隐含值
在声明属性时,您必须始终指定值声明。如果要声明的属性没有默认值、没有固定值且不是必需的,则必须将该属性声明为 隐含。关键字 #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>
在上面的示例中,相应的实体名称name、company和phone_no在XML文档中被其值替换。实体值通过在实体名称前添加前缀 & 来取消引用。
将此文件保存为sample.xml并在任何浏览器中打开它,您会注意到name、company、phone_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中发挥作用,它们是:
和号:&
单引号:'
大于号:>
小于号:<
双引号:"
示例
以下示例演示了内置实体声明:
<?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 "©"> ]> <author>&writer;©right;</author>
您会注意到这里我们使用了©作为版权字符的值。将此文件保存为sample.xml并在浏览器中打开它,您将看到版权被字符©替换。
通用实体
在XML文档中使用通用实体之前,必须在DTD中声明它们。通用实体不仅可以表示单个字符,还可以表示字符、段落,甚至整个文档。
语法
要声明一个通用实体,请在您的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(开源)来验证XML文件相对于DTD文档的有效性。
使用XML DTD在线验证器 - W3C标记验证服务旨在验证Web文档。使用在线验证器检查XML DTD的有效性此处。
使用XML DTD验证API编写您自己的XML验证器 - JDK的新版本(1.4以上)支持XML DTD验证API。您可以编写自己的验证器代码来检查XML DTD验证的有效性。