文档介绍:文档类型定义(DTD)
目标
章节目标:
通过本章学习,你应该能够:
掌握DTD的基本结构
掌握DTD在XML文档中的引用
掌握DTD中元素和属性的声明
引言
在实际开发中,我们经常会遇到这样一个有趣的问题:如何与他人交流自己设计的结构?
目前很多主流的浏览器已经提供了对XML的支持,但这种支持仅限于对XML内容的显示。如果所开发的程序还包含了新的词汇表,而通过这些新的词汇就可以明白作者的设计结构,那么作为XML词汇表的设计者,就必须通过某种通用的方式来说明词汇表的语法规则。为此,XML —文档类型定义(DocumentType Definition,DTD),并将其作为规范的一部分。
DTD文档结构
『例3-1』含有内部DTD的XML文档。
<?xml version = "" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 联系人列表[
<!ENTITY content "某公司部分联系人信息">
<!ELEMENT 联系人列表(说明,联系人)>
<!ELEMENT 说明(#PCDATA)>
<!ELEMENT 联系人(姓名,ID,公司,EMAIL,电话,地址)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT ID (#PCDATA)>
<!ELEMENT 公司(#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
<!ELEMENT 电话(#PCDATA)>
<!ELEMENT 地址(街道,城市,省份)>
<!ELEMENT 街道(#PCDATA)>
<!ELEMENT 城市(#PCDATA)>
<!ELEMENT 省份(#PCDATA)>
<!ATTLIST 电话类别 CDATA "固定电话">
]>
<联系人列表>
<说明>&content;</说明>
<联系人>
<姓名>张三</姓名>
<ID>001</ID>
<公司>A公司</公司>
<EMAIL>zhang@</EMAIL>
<电话类别=”固定电话”>(010)62345678</电话>
<地址>
<街道>五街1234号</街道>
<城市>北京市</城市>
<省份>北京</省份>
</地址>
</联系人>
</联系人列表>
DTD中的元素声明
元素声明的语法
元素类型声明的基本语法如下:
<!ELEMENT elementName elementContentModel>
控制元素的内容
根据元素所包含的内容,即通过元素内容模型(ECM)可以将元素内容类型归纳为以下六种:
简单类型:元素内容只能是文本字符内容,且没有属性;
包含简单内容的复杂类型:元素内容只能是文本字符内容,但可以有属性;
包含复杂内容的复杂类型:元素内容可以包含子元素,也可以有属性;
混合内容类型:元素内容既可以有文本字符内容,也可以包含子元素,同时还可以有属性;
空内容类型:元素内容为空,但可以有属性,此类元素一般都带有属性;
任何内容类型:元素内容不受限制,也可以有属性。
简单类型声明
简单类型表示元素只能含有文本字符,声明语法如下:
<!ELEMENT elementName (#PCDATA)>
例如对例3-1中的“说明”元素的声明:
<!ELEMENT 说明(#PCDATA)>
对于这个声明,以下的“说明”元素的使用都是合法的:
<说明>&content;</说明>
<说明>某公司部分联系人信息</说明>
包含简单内容的复杂类型声明
带有简单内容的复杂类型的元素类型声明(ETD)采用的结构与简单类型声明的结构一样。但是在该元素上还有属性定义,即还要在DTD 中给该元素声明属性。
如例3-1中的“电话”元素的声明:
<!ELEMENT 电话(#PCDATA)>
<!ATTLIST 电话类别 CDATA "固定电话">
对于这个声明,“电话”元素的以下使用是合法的:
<电话类别=”固定电话”>(010)62345678</电话>
<电话类别=”移动电话”>**********</电话>
包含复杂内容的复杂类型声明
复杂内容表示元素内容可以包含其他元素作为该元素的子元素。复杂类型表示该元素上可以有属性。对复杂内容的声明,只需将含有简单内容的复杂类型的声明中内容模型(ECM)部分改为相应的子元素即可,语法如下:
<!ELEMENT elementName (element1,element2,…)>
对于所包含子元素,可以控制其出现的先后顺序,出现的次数,从子元素中进行选择,还可以对子元素进行分组。
(1)控制子元素出现的先后顺序
在这种格式下,元素拥有哪些子元素、每个子元