过马路我们都知道要走人行横道,开车要靠右行驶......这些都是我们熟知的交通法则。那么在XML中也有一套法则——DTD,让我们来认识一下它吧。
定义与用途
DTD定义XML文件的结构;为XML文件提供语法与规则;内容 既可以定义在XML文件中,也可以定义在XML文件之外;使用XML进行数据交换的行业和组织可定义自己的DTD;DTD对于XML是可选的内容。
为什么要使用DTD?为了正确交换数据,XML文件需要确定的结构。
XML内置DTD内容:
<?xml version="1.0" encoding="utf-8"?> <DOCTYPE 书籍列表[ <!ELEMENT 书籍列表(计算机书籍)*> <!ELEMENT 计算机书籍(书名,价格,简要介绍)> <!ELEMENT 书名(#PCDATA)> <!ELEMENT 价格(#PCDATA)> <!ELEMENT 简要介绍(#PCDATA)> ]> <书籍列表> <计算机书籍> <书名>XML的今生今世</书名> <价格>66.66</价格> <简要介绍> 该书详细描写XML的从出生到衰老的整个过程 </简要介绍> </计算机书籍> </书籍列表>外部DTD:
DTD文件book.dtd:
<?xml version="1.0" encoding="utf-8"?> <!ELEMENT 书籍列表(计算机书籍)*> <!ELEMENT 计算机书籍(书名,简要介绍)> <!ELEMENT 书名(#PCDATA)> <!ELEMENT 价格(#PCDATA)> <!ELEMENT 简要介绍(#PCDATA)>使用外部DTD文件的XML文件
<?xml version="1.0" encoding="utf-8"> <!DOCTYPE 书籍列表 SYSTEM "book.dtd">每个XML文档单独定义的DTD推广位一个系统内共享的公用DTD,关键字SYSTEM用于引用一个作者或组织所编写的众多XML文档中通用的DTD。另一种外部DTD,一个由权威机构制定的,提供给特定行业或公众使用的DTD。关键字是PUBLIC。
结构
所有的XML文档(以及HTML文档)均由以下简单的构建模块构成:元素、属性、实体、PCDATA、CDATA。
PCDATA的意思是被解析的字符数据(Parsed character data),是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
CDATA的意思当然就是字符数据(character data),是不会被解析器解析的文本。在这些文本中的标签不会被当做标记来对待,其中的实体也不会被展开。
定义元素
在一个DTD中,元素通过元素声明来进行声明
声明一个元素:<!ELEMENT 元素名称 类别>或者<!ELEMENT 元素名称(元素内容)>
声明空元素:<ELEMENT 元素名称 EMPTY>
声明只有PCDATA的元素:<!ELEMENT 元素名称 (#PCDATA)>
声明带有任何内容的元素:<!ELEMENT 元素名称 ANY>
声明带有子元素(序列)的元素:<!ELEMENT 元素名称 (子元素名称1,子元素名称2,......)>,当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。
声明只出现一次的元素:<!ELEMENT 元素名称 (子元素名称)>
声明最少出现一次的元素:<!ELEMENT 元素名称 (子元素名称+)>
声明出现零次或多次的元素:<!ELEMENT 元素名称 (子元素名称*)>
声明出现零次或一次的元素:<!ELEMENT 元素名称 (子元素名称?)>
声明“非.../既...”类型的内容:
例子:<!ELEMENT note(to,from,header,(message|body))>
声明混合型的内容:
例子:<!ELEMENT note (#PCDATA|to|from|header|message)*>
定义元素的属性
在DTD中,属性通过ATTLIST声明来进行声明。
声明属性:<!ATTLIST 元素名称 属性名称 属性类型 默认值>
以下是属性类型的选项:
默认值参数可使用下列值:
小结
通过学习,我们知道了怎么描述XML文档的结构,如何使用DTD定义一个XML文档的合法元素,以及如何在您的XML内部或者作为一个外部引用来声明DTD。您已经学习了如何为XML文档声明合法的元素、属性。如果你认为到这里DTD就学完了,那就大错特错了,请期待下一篇博客,我们将继续DTD的学习。