文件类型定义(Document Type Definition,简称DTD)允许用户定义在XML文档中出现的元素、元素出现的次序、元素之间如何相互嵌套以及XML文档结构的其他详细信息。本节介绍有关DTD的基本知识。
1.DTD范例
DTD允许用户定义XML文档的组织结构,例如,可以像下面一样为前面介绍的地址信息XML定义DTD(可以用Dreamweaver MX创建XML文档的方式先创建该文件,然后另存为.dtd文件)。
〈!--address.dtd --〉
〈!ELEMENT address (name,city,street,postal-code)〉
〈!ELEMENT name (first-name,last-name,title?)〉
〈!ELEMENT first-name (#PCDATA)〉
〈!ELEMENT last-name (#PCDATA)〉
〈!ELEMENT title (#PCDATA)〉
〈!ELEMENT city (#PCDATA)〉
〈!ELEMENT street (#PCDATA)〉
〈!ELEMENT postal-code (#PCDATA)〉
在这个文件类型定义中,我们定义了以下元素:〈address〉包含〈name〉、〈city〉、〈street〉、〈postal-code〉元素;〈name〉包含〈first-name〉、〈last-name〉和一个可选的〈title〉元素;以及其他显示文本数据的元素(#PCDATA 元素代表已解析的字符元素,在该元素中不能再包含其他元素)。
为XML文档定义DTD后,文档必须包含DTD中定义的所有元素,并且要按照 DTD中的元素顺序在文档中出现。
DTD文件也是一个ASCII的文本文件,文件扩展名为 .dtd。
2.DTD文件声明
如果文档是一个“有效的XML文档”,那么文档一定要有相应DTD文件,并且严格遵守DTD文件制定的规范。DTD 文件的声明语句紧跟在XML声明语句后面,格式如下:
〈!DOCTYPE type-of-doc SYSTEM/PUBLIC "dtd-name"〉
其中:
"!DOCTYPE" 说明要定义一个 DOCTYPE;
"type-of-doc"是文档类型的名称,由用户自己定义,通常与DTD文件名相同;
"SYSTEM/PUBLIC" 这两个参数只用其一。SYSTEM 是指文档使用私有的DTD文件,而 PUBLIC 则指文档调用一个公用的DTD文件。
"dtd-name" 就是DTD文件的地址和名称。
例如,对于之前介绍的地址信息XML文档,可以使用如下语句:
〈?xml version="1.0" encoding="GB2312"?〉
〈!DOCTYPE address SYSTEM "address.dtd"〉
〈address〉
……
使其遵守前面定义的 address.dtd 文件的 DTD。
实际上,还可以将DTD直接包含在文档中,例如:
〈?xml version="1.0" encoding="GB2312"?〉
〈!DOCTYPE address [
〈!ELEMENT address (name,street,city,postal-code)〉
〈!ELEMENT name (first-name,last-name,title?)〉
〈!ELEMENT first-name (#PCDATA)〉
〈!ELEMENT last-name (#PCDATA)〉
〈!ELEMENT title (#PCDATA)〉
〈!ELEMENT city (#PCDATA)〉
〈!ELEMENT street (#PCDATA)〉
〈!ELEMENT postal-code (#PCDATA)〉
]〉
〈address〉
……
与前面调用独立的DTD文件效果一样。
3.DTD中的符号表示
DTD 中有几个符号用于指定某元素在XML文档中可能出现的次数。以下示例是这些符号的表示含义:
〈!ELEMENT address (name,street,city,postal-code)〉
元素〈address〉必须包含一个〈name〉元素、一个〈street〉元素、一个〈city〉元素和一个〈postal-code〉元素,这些元素在文档的中也必须以这个顺序出现。逗号表示元素的列表项目,在一个定义的元素中,使用逗号分隔的项目必须在文档中按照这个顺序出现。
〈!ELEMENT name (title? first-name,last-name)〉
元素〈name〉必须包含一个可选的〈title〉元素、一个〈first-name〉元素和一个〈last-name〉元素。其中问号表示该元素可以出现也可以不出现,而后面两个元素则是必须出现,并按照这个顺序出现。
〈!ELEMENT booktitle (title+)〉
元素〈booktitle〉中至少包括一个以上的〈title〉元素,可以是任意多个,但不能少于一个。加号表示不少于一个元素。
〈!ELEMENT bookname (name*)〉
元素〈bookname〉包含任意多个〈name〉元素,包括0个。星号表示可以包括任意多个项目元素。
〈!ELEMENT body (title?,table-align,(left | center | right)?,text*)〉
元素〈body〉包含一个可选的〈title〉元素、一个〈table-align〉元素、一个可选的〈left〉或〈center〉或〈right〉元素,最后是个任意多个 text 元素。竖线符号表示只能在多个项目中选择其一。
4. 定义元素的属性
在DTD中用户不仅可以定义元素来组织文档,还可以定义元素的属性。用户可以为元素定义哪些属性是必须的、属性的默认值以及属性的有效值。
下面示例代码显示了如何定义元素的属性:
〈!ELEMENT city (# PCDATA)〉
〈!ATTLIST city province CDATA #REQUIRED
postal-code CDATA #REQUIRED〉
在这段代码中,我们定义了〈city〉元素,同时为它指定了两个属性 province 和 postal-code。关键字 CDATA 和 #REQUIRED 说明属性中包含字符数据并且是必须的,如果属性是可选的,则可以使用关键字 #IMPLIED。
下面示例代码列举了如何定义属性的默认值以及属性的有效值:
〈!ELEMENT table (#PCDATA)〉
〈!ATTLIST table align CDATA (left | center | right) "left"〉
其中元素〈table〉的属性 align 默认值是 left,有效取值为 left、center、right。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。