首先说明的是文档类型定义(Document Type Definition)与文档类型声明(Document Type Declaration)是不同的,而且在缩写的时候只有文档类型定义的缩写为DTD;文档类型声明指定了使用DTD,而DTD描述了XML的文档结构。
文档类型声明出现在文档的序言部分,处在XML声明之后,元素实例之前,并且一个XML文档只能有一个文档类型的声明。文档类型声明是以<!DOCTYPE 开始,以>结束。文档类型声明包括DTD或DTD所在文档的URL。文档类型声明包含或者引用DTD,但DTD不包括文档类型声明。
文档类型声明分为3种形式:1,内部的DTD声明;2,外部的DTD声明;3,内部DTD与外部DTD结合的声明。
DTD的用途:XML可以用DTD来验证自身数据的有效性。
一个DTD文档主要包含:1,元素(ELEMENT)的定义规则;2,元素间关系的定义规则;3,元素可使用的实体(ENTITY)或注记(NOTATION)规则;4,元素可使用的属性(ATTLIST);5,属性 的定义规则;
元素声明的格式为: <!ELEMENT 元素名 元素内容模式>
元素内容模式:1,EMPTY:用于定义空元素,所声明的元素只可能有属性而不会有字符数据或子元素。
<!ELEMENT 元素名 EMPTY>
2,ANY:可以包含DTD中定义的其他任何元素或已编译的字符数据,可以使PCDATA、元素或元素和PCDATA的混合内容,也可以是空元素。
<!ELEMENT 元素名 ANY>
3,#PCDATA:是不包含其他任何子元素而只包含字符数据的元素。
<!ELEMENT 元素名 #PCDATA>
4,子元素模式:可以包含一系列的子元素,但不能包含字符数据。
<!ELEMENT 元素名 (子元素1,子元素2,子元素3,.....) >
5,混合模式:可以包含子元素又可以包含已编译的字符数据,即字符数据与子元素的混合。
<!ELEMENT 元素名 (#PCDATA|子元素1|子元素2|......) *>
元素在声明中正则表达式的含义:
元字符 | 含义 |
* | 星号表示可选项目,在使用中它可以出现任意多次 |
+ | 加号表示项目可以出现任意多次,但必须至少出现一次 |
? | 问号表示可选的项目在使用中只能出现一次或不出现 |
() | 一组要共同匹配的表达式 |
| | OR关系,表示可以选择用竖线分隔开的若干个项目中的一个 |
, | AND关系,表示要求严格遵守从声明时的顺序要求 |
元素属性的声明语法:
<!ATTLIST 元素名 属性名1 属性1类型 缺省属性1取值
属性名2 属性2类型 缺省属性2取值 ......... >
属性的类型:
属性类型 | 含义 |
CDATA | 任意的字符数据,即没有标记的文本 |
NMTOKEN | XML名称标记 |
NMTOKENS | 由空格分隔的多个XML名称标记 |
ID | 不被文档中任何其他ID类型属性共享的唯一的名称 |
IDREF | 文档中ID类型属性的值 |
IDREFS | 由空格分隔的多个ID类型属性的值 |
Enumerated | 枚举类型,即可选择的可能值列表 |
NOTATION | 在DTD中声明的注记的名称 |
ENTITY | 在DTD中声明外部实体的名称 |
ENTITIES | 在DTD中声明的由空格分隔的多个外部实体的名称 |
元素属性默认值的含义 :
属性默认值 | 含义 |
#REQUIRED | 元素的每个实例必须包含该属性 |
#IMPLIED | 元素实例可以选择是否包含该属性 |
#FIXED+固定值 | 属性值固定为指定的值,如果元素中不包含该属性,解析器会自动将属性值设置为固定值 |
默认值 | 如果元素中不包含该属性,解析器会自动将默认值设置为属性值;也可以用其他属性值覆盖默认值 |