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的专门文献进行学习。
共有条评论 网友评论