文章教程

17.3.7文件类型定义(DTD)

9/17/2020 9:26:54 PM 人评论 次浏览

17.3.7 文件类型定义(DTD)

至此为止,已经向读者介绍了大部分关于XML的知识。通过对前面内容的学习,读者应该了解到,XML的精髓是基于信息描述的、能够体现数据信息之间逻辑关系的、可以确保文件的易读性和易搜索性的自定义标记。一个完全意义上的XML文件不仅应该是“形式良好的”,而且还应该是使用了自定义标记的XML文件。定义用来表示数据的标记,最常用的方法就是实用文档定义类型(Document Type Definition),即所谓的DTD。

DTD指定在XML文档中出现的元素、这些元素出现的次序、元素相互嵌套的关系以及XML文档结构的其他详细信息,DTD是XML规范的一部分。一个XML文件必须遵守文件类型描述DTD(Document Type Definition)中定义的种种规定。DTD定义了文件的整体结构以及文件的语法。简而言之,DTD规定了一个语法分析器为了解释一个“有效的”XML文件所需要知道的所有规则的细节。这些规则有时很简单,有时会很复杂。比如说,列出所有有效的元素、标记、属性和实体,这就是一个比较简单的规则。又如,指出元素之间的内在联系,说明某个元素必须包含的其他元素,就是一个比较复杂的规则。下面就来学习DTD的基本用法。

DTD用来指定XML文档的基本结构,最简单的使用DTD的方法是在XML文件的序言部分加入一个DTD描述,加入的位置是紧接在XML处理指示之后,其结构如下所示。


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

<!DOCTYPE根元素名[

元素描述

]>

文件体


这段代码表示该XML文档使用DOCTYPE中规定的“根元素名”作为其根元素的名字。一个DTD不仅要告诉XML分析器该XML文件的根元素是什么,而且还要告诉语法分析器文件的内容和结构,说清文件结构中的每一个细节。为了描述这些细节,必须展开DTD中元素说明部分,使用元素类型声明(Element Type Definition,ETD)来声明所有有效的文件元素。ETD结构如下所示。


<!ELEMENT元素名元素内容描述>


在上述例子中,可以通过如下方式定义“图书信息”这个元素,如下所示。


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

<!DOCTYPE books[

图书信息

<!ELEMENT books ANY>

]>

<books>

</books>


这个DTD定义XML文件只有一个根元素,ANY表示这个元素可以有任何类型的子元素,也可以是纯文本,还可以为空。

注意 除了根元素外,在定义其他元素时使用关键字ANY都是不好的习惯。

通常需要在XML文档中的根元素之内加入其他元素,这个XML文档才是有效的,才是可以被XML解释器所能接受的XML文档。为了使元素“books”中还可以包含其他元素,还需要定义元素“book”(即具体的图书)和元素“title”(即图书的名称),如下代码所示。


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

<!DOCTYPE books[

图书信息

<!ELEMENT books(book)>

<!ELEMENT book(title)>

<!ELEMENT title(#PCDATA)>

]>

<books>

<book>

<title>Learning PHP5</title>

</book>

<books>


至此,已经定义了一个XML文档,它还有一个名为books的根元素,根据DTD的描述,该根元素中可以包含book元素,book元素又包含子元素,名为title。而title只能包含纯文本数据,这在DTD中用#PCDATA来体现。下面是一个加入了DTD描述的较为完整的XML文档,它以代码17-1为基础。


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

02 <!DOCTYPE books[

03 图书信息

04 <!ELEMENT books(book)*>

05 <!ELEMENT book(title,author,publisher,price)>

06 <!ELEMENT title(#PCDATA)>

07 <!ELEMENT author(#PCDATA)>

08 <!ELEMENT publisher(#PCDATA)>

09 <!ELEMENT price(#PCDATA)>

10 ]>

11

12 <books>

13 <book>

14 <title>Learning PHP5</title>

15 <author>David</author>

16 <publisher>White Water Press</publisher>

17 <price>29.90</price>

18 </book>

19 <book>

20 <title>Learning XML</title>

21 <author>Jeffson</author>

22 <publisher>White Water Press</publisher>

23 <price>50.79</price>

24 </book>

25 <books>


【代码解析】在这个XML文档中读者还可以看到其他一些符号,这些符号用来指定元素在XML出现的次数,如<!ELEMENT books(book)*>,这里的*表示<books>元素必须包含0个或多个book元素。星号表示这一项可以出现任意次,包括零次。下表列举了DTD中可以使用的一些符号及其解释。

这些符号的使用都类似于正则表达式,例如<!ELEMENT addressbook(address+)>,表示<addressbook>元素包含一个或多个<address>元素。可以有任意多的<address>元素,但必须至少有一个。加号表示这一项可出现任意次,但至少出现一次。

使用DTD也可以定义属性。在DTD中定义属性时,使用的格式如下所示。


<!ATTLIST元素名(属性名属性类型默认值)*>


使用DTD可以完成的对属性的定义功能如下所示。

❑定义哪些属性是必须的

❑定义属性的默认值

❑列出给定属性的所有有效值

下面是一个使用DTD定义属性的示例代码。


<!ELEMENT city(#PCDATA)>

<!ATTLIST city province CDATA#REQUIRED>


这段示例XML代码定义了<city>元素,同时使用关键字ATTLIST声明元素的属性。属性列表中的名称city告知解析器这些属性是为元素<city>定义的。名称province是属性的名称,关键字CDATA和#REQUIRED告诉XML解析器province属性包含文本并且是必须的。如果是可选的,可以使用CDATA#IMPLIED。

XML中,关于DTD的内容是相当丰富的,本书只是略微介绍了DTD的一些基本概念和基础用法,更深更多的内容并没有涉及,有兴趣的读者可以参考有关XML的专门文献进行学习。

教程类别