DTD的结构:
DTD的结构一般由元素类型声明,属性表声明,实体声明,记号声明等构成。一个典型的文档类型定义文件会把将来要创建的XML文档的元素结构,属性类型,实体引用等预先进行定义。
1.元素类型声明
元素类型声明采用如下的语法格式:
<!ELEMENT 元素名称 元素内容说明>元素内容说明可以指明以下5种可能的元素内容形式。
(1)#PCDATA
关键字#PCDATA说明元素包含字符数据。
(2)子元素
说明元素包含的是子元素。当一个元素只包含子元素而没有字符数据时,则称此元素类型具有元素型内容。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE hr[
<!ELEMENT hr(employee)>
<!ELEMENT employee ((name,age,salary),interest*,spouse?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT salary (cash| credit_card)>
<!ELEMENT interest (#PCDATA)>
<!ELEMENT spouse(#PCDATA)>
......
hr为根元素,employee是它的子元素,而employee又包含name,age,salary,interest,spouse子元素,salary为选择型,必须包含cash或credit_card中的其中一个子元素。注意的是interest子元素可能有0个或多个。如果希望interest至少有一个或多个,可以改为interest+。spouse?表示可以有0个或1个spouse子元素。
(3)混合内容
表明元素既可以包含字符数据,也可以包含子元素。混合内容必须被定义零个或多个。
<!ELEMENT employee (#PCDATA | name)*>
<!ELEMENT name (#PCDATA)>
表示employee元素的内容可以包含零个或多个字符数据,包含零个或多个name子元素。
(4)EMPTY
关键字EMPTY表明该元素既不包含字符数据,也不包含子元素,是一个空元素。
(5)ANY
关键字ANY表明该元素可以包含任何的字符数据和子元素,只要它们不违反XML格式的约束。实际应用中应该尽量避免使用ANY。
2.实体声明
有两种类型的实体:一般实体和参数实体,一般实体是在文档内容中使用的实体,而参数实体则是在DTD中使用的已分析实体。
(1)一般实体和参数实体
一般实体的声明语法如下:
<!ENTITYE 实体名 "实体内容">
引用实体的方式为:"&实体名;"。
参数实体只能在DTD中使用,它的声明语法如下:
<!ENTITY % 实体名 "实体内容">
引用实体的方式为:"%实体名;"。
在DTD中,所有的参数实体必须在引用前进行声明。
(2)内部实体和外部实体
内部实体在XML文档内部定义,实体的内容在声明中给出。内部实体都是已分析的实体。
外部实体在单独的文件中定义,外部实体可以使已分析实体,也可以使未分析实体。外部一般实体的声明格式如下:
<!ENTITY copyright SYSTEM "http:..www.sunxin.org/copyright.xml">
关键字SYSTEM表明这是一个私有的外部一般实体。
3.属性表声明
属性表声明的语法如下:
<!ATTLIST 元素名 属性名 属性类型 默认声明>
(1)默认声明
#REQUIRED说明必须为元素提供该属性,也就是凡是出现该元素的地方,就必须加上该属性值。
#IMPLIED说明元素可以包含该属性,也可以不包含该属性。
#FIXED+默认值,说明一个固定的属性默认值,文档的编写者不能修改该属性的值。
只有默认值,同FIXED+默认值类似,只是这种声明方式属性的值是可以改变的。
(2)属性类型
分别有下面十种类型:
CDATA 最常用的一种属性类型,表明属性值为字符数据。
Enumerated 在声明属性市,可以限制属性的取值只能从一个列表中选择,注意枚举类型的属性声明并没有使用关键字Enumerated,此处只是用于说明目的。例如:
<!ATTLIST person sex (male |female) #REQUIRED>列表中的可选属性值,不用加双引号或单引号。
ID,IDREF,IDREFS一个ID类型的属性值惟一标识XML文档中的一个元素,ID类型的属性值必须遵守XML名称定义的规则,以字母,下划线或冒号开头,名称中不能带空格。一个元素只能有一个ID类型的属性,ID类型的属性必须设置为#IMPLIED或#REQUIRED,因为ID类型属性的每一个取值都是用来标识一个特定的元素。
IDREF类型的属性值为同一个文档中另一个元素的ID类型的属性值,而这另一个元素的ID类型的属性值必须是已经存在的。
如果一个属性需要引用文档中多个ID类型的属性值,则可以把它声明为IDREFS类型,IDREFS类型的属性值是一系列以空格分隔的ID类型的属性值,而且必须与文档中已有的ID类型属性值相匹配。
ENTITY类型的属性把外部的二进制数据链接到文档。ENTITY类型的属性值是在DTD中声明的未分析的一般实体的名称。首先声明一个ENTITY类型的属性来引入图像:
<!ATTLIST image src ENTITY #REQUIRED>
在DTD中,还需要声明一个外部的一般实体:
<!ENTITY logo SYSTEM http://www.sunxin.org/logo.gif NDATA gif>
关键字NDATA表示该实体是一般未分析的实体,后面的gif是记号名称(notation name),说明实体的数据格式或指定一个外部的处理程序。记号gif的声明如下:
<!NOTATION gif SYSTEM "iexplore.exe">
最后,在XML文档中,我们可以在src属性中引用图像:<image src='logo'/>将http://www.sunxin.org/logo.gif文件与image元素关联在一起。
ENTITIES类型和IDREFS类型的使用是类似的,它的值是多个空格分隔的ENTITY类型的属性值,见下例:
添加一个实体声明<!ENTITY banner SYSTEM http://www.mybole.com.cn/banner.gif NDATA gif>
然后将元素image的属性声明改为:
<!ATTLIST image src ENTITIES #REQUIRED>
最后在XML文档中,通过src属性引用两幅图像:
<image src="logo banner"/>。
NMTOKEN,NMTOKENS
NMTOKEN(name token),名称标记是任何命名字符的混合体。NMTOKEN类型的属性值是受限制的文本,只能包含名称字符,不能包含空白字符。
NOTATION类型属性的值就是在记号声明中的名称。
4.记号声明
通过DTD的记号声明,可以为XML处理器不支持的数据描述一种可能的格式或者指定一个外部的处理程序。
记号声明有两种形式,一种是使用MIME类型(多用途Internet邮件扩展),形式是:
<!NOTATION gif SYSTEM "image/gif">
另一种是使用URI路径,指出外部处理程序的位置:
<!NOTATION gif SYSTEM "iexplore.exe">