1 元素声明
DTD 中所用的第一种声明是元素声明。其形式如下:
<! ELEMENT name content>
其中,name是一个标准的XML标记的名字。
Content由以下三种之一组成:
关键字EMPTY;
关键字ANY;
描述包含在本元素中的子元素的顺序和重复次数的内容模型。
可以看出,文档中的每一元素在DTD中都有一个相应的声明。只有在DTD中定义
的元素才能出现在文档中。定义元素的顺序是任意的。一般来说,先定义高层次的元素会更好些
在DTD中声明元素时应注意:
(1)声明以关键字ELEMENT开头,后面是元素名和包含于元素中的子元素列表
(2)数据类型不是DTD的一个特征。
(3)上述DTD中所定义的每个元素,在对应的XML文档中有且仅有一个。若要指
定某个元素出现的次数,则需使用元素出现的次数,则需使用元素出现次数指示符
(4)XML是区分大小写的,所以,ELEMENT和上面其他大写形式的关键字必须用大写字母
2 元素内容类型(Eelement Content Model)
元素内容通常有5种情况:EMPTY,ANY,#PCDATA,子元素和混合型.
1)EMPTY类型
EMPTY用于定义空元素,该元素只可能有属性而不会有字符数据或子元素,如
<banner>元素.其形式为<banner/>或者<banner></banner>
声明空元素的语法是
2)ANY类型
这种类型的元素声明是:
<!ELEMENT anyelement ANY>
这表明该元素可包含DTD中定义的其他任何元素或已编译的字符数据.
ANY的使用应加以限制.DTD的出发点是设置规则来清晰地定义各种元素.而使用ANY就意味元素可以包含DTD中定义的所有其他元素,实质上没有什么规则限制.这与使用DTD的目的背道而驰,所以不鼓励使用
3)#PCDATA类型
不包含其他元素而包含字符数据的元素(如<form>),用关键字#PCDATA进行定义,它代表"已编译的字符数据"
如
<! ELEMENT para(title,text)>
<! ELEMENT tilte(#PCDATA)>
<! ELEMENT text(#PCDATA)>
PCDATA可以包含除标记以外的一切字符,包括数字,字母和符号等. 被定义包含PCDATA的元素不能包含任何其他子元素.
4)子元素类型
元素可以包含一系列的子元素,子元素内容模型用于指定某个元素可以包含哪些子元素,
如
<!ELEMENT message(header,body,signature,footer)>
说明message元素包含4个元素,依次是header,body,signature和footer元素。
根据子元素间的关系,子元素内容模型可以有两种可能的结构:序列和选择。
(1)序列
对message元素的声明,其所有子元素必须出且有仅出现一次,而且要依次出,这种结果称为序列。
如,若与其对应的XML文档中,body子元素出现在header子元素之前而不是这后,则该文档即使是结构良好,但由于它未遵循该DTD,从而也是无效的。
使用序列时应注意两点:
首先,序列中不能出#PCDATA。
其次,子元素自身还可以包含其他子元素
(2)选择
元素间的选择可以进行如下声明
<!ELEMENT elem(subelem1|subelem2|subelem3)>
将子元素用“|”进行分隔,表明elem元素的子元素为subelem1,subelem2,subelem3三者之一
5)混合类型
若某元素既包含子元素又包含已编译的字符数据,则该元素具有混合内容
其声明的语法如下:
<! ELEMENT pick(#PCDATA |one|two|three)*>