DTD定义了数据是如何格式化的。它必须为XML文档定义每个允许使用的元素和属性,可能接受的属性值,每个元素的嵌套和出现的方式,以及任何的外部实体。DTD还可以指定XML文档其他方面,但是这些基本内容是我们要重点关注的。
DTD语义
元素
DTD多数是由ELEMENT定义和ATTRIBUTE定义组成的。元素的定义是以ELEMENT关键字开头,跟在标准DTD标签的起始标记“<!”之后。后面是这个元素的名称,在紧接着元素名称之后是这个元素的内容模式。内容模式一般放在圆括号内,用来定义什么内容可以包含在元素中。以item元素来举例说明:
这是针对任何item元素而言,它可能还有title元素,link元素,或者description元素嵌套在item元素内。“or”关系是由“|”符号表示的,可以表示一组元素的关联关系,并用圆括号来标识。也就是说,对于这个组(title | link|description),title,link,description这三个元素只能从这三者之中选择其一。这个组后面的 * 符号表示重复零次或多次,下表列出了表示DTD元素重复的操作符号:
操作符号 | 描述 |
[默认] | 只能出现一次(1) |
? | 出现零次或一次(0 .. 1) |
+ | 出现一次或多次(1 .. N) |
* | 出现零次或多次(0 .. N) |
因此,再次访问item元素时,在item元素中定义的title,link,或者description可能会出现,且这组元素可以出现多次,也就意味着在item元素中可以存在任意数目的title,link,或者description元素,而且这个XML文档仍然是合法的。
举一个重复应用元素的实例,看下面skipHours元素的定义:
在skipHours元素中必须至少有一个hour元素,但是没有最大数量的限制。
你可以使用逗号(,)操作符进行排序:
在subscribers内,只能有一个(有且仅有一个)url元素,后面跟着是一个email元素,最后是零个或多个comment元素。
如果元素内包含字符数据,使用#PCDATA关键字作为它的内容模式:
如果元素内不包含任何内容,使用EMPTY关键字:
属性
一旦处理元素的定义,就会想到需要定义属性。属性都是通过关键字ATTLIST来定义的。第一个是元素的名称,然后是多种属性的定义。这些属性定义要包含属性的名称,属性的类型[即属性是必须包含,还是可选的(意指该属性不是必须的)]。属性值是文本的属性可以简单地使用CDATA表示属性类型即可。如下所示:
你也可以为属性指定一系列的值,在进行文档分析时这些属性值都应该是合法的(下面范例是描述技术书的DTD):
实体
你可以在DTD中使用ENTITY关键字指定实体引用。这与DOCTYPE引用类似:
这就是在指定的URL地址上装载copyright.xml文件,作为O'Reilly copyright实体引用的值,在下面的范例中使用到了这个引用 :
$OReillyCopyright;