DTD的概念是在学习XML的过程中接触到的,虽然现在DTD已经几乎不用了,但是还是抽空来学习记录一下,希望对大家有用。
一、初识DTD
DTD(document type definition)是指文档类型定义,可以定义合法的XML文档构建模块,其可以被声明在XML文档中,也可以作为外部引用。什么意思,这里我们类比java的类和实例,DTD就像定义了一个类结构,而XML就是定义出的类的一个实例。至于为什么使用DTD,则是主要用来解决传输问题,它的存在可以使我们能够使用某个标准的DTD来 交换数据、检验数据。
下面我们举一个例子来展示DTD被包含在XML源文件内部的情况,此时它需要被包装在一个DOCTYPE声明中:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Rose</to>
<from>Jake</from>
<heading>Reminder</heading>
<body>Let's have dinner together!</body>
</note>
其中DTD被包装在<!DOCTYPE 根元素[元素声明]>中,其中!DOCTYPE note定义了文档类型是note,!ELEMENT note(to,from,heading,body)定义了note元素的四个子元素,下面的几行分别定义了元素的类型。
接下来我们再来举一个外部引用的例子,此时它需要被包装在一个这样的<.!DOCTYPE 根元素 SYSTEM “文件名”>中:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Rose</to>
<from>Jake</from>
<heading>Reminder</heading>
<body>Let's have dinner together!</body>
</note>
然后还必须有一个包含DTD的“note.dtd”文件:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
二、DTD构建模块
所有的XML文档均由元素、属性、实体、PCDATA、CDATA这些简单模块构建而成,关于元素、属性、实体的介绍可以移步XML部分,下面简单介绍一下PCDATA和CDATA。PCDATA是parsed character data的缩写,意思是被解析的字符数据(所谓字符数据可以理解为是开始标签与结束标签之间的文本);CDATA是character data的缩写,意思是字符数据,综合比较两者,可以看出前者是会被解析器解析的文本,文本中的标签会被当做标记去处理,实体也会被展开,而CDATA不会被解析器所解析。
三、DTD元素
1、DTD中XML元素通过下面的语法来进行声明:
<!ELEMENT 元素名称 类别>
或者
<!ELEMENT 元素名称 (元素内容)>
其中空元素通过EMPTY来进行声明。
2、中有PCDATA的元素,通过圆括号中的#PCDATA来声明:
<!ELEMENT 元素名称(#PCDATA)>
3、带有任何内容的元素,指可以包含任何可解析数据的组合:
<!ELEMENT 元素名称 ANY>
4、带有子元素的元素(必须按顺序出现):
<ELEMENT 元素名称(子元素1,子元素2...)>
5、声明只出现一次的元素(在父元素中有且仅有一次出现):
<!ELEMENT 元素名称 (子元素名称)>
eg:<!ELEMENT note(message)>,message必须出现一次,且必须只在note元素中出现一次
6、声明最少出现一次的元素:
<!ELEMENT 元素名称 (子元素名称+)>
7、声明出现零次或多次的元素:
<!ELEMENT 元素名称 (子元素名称*)>
8、声明“非.../既...”类型的内容:
eg:<!ELEMENT note(to,from,header,(message|body))>
声明了note元素必须包含to、from、header以及非message元素既body元素
9、声明混合型的内容:
eg:<!ELEMENT note(#PCDATA|to|from|header|message)*>
声明了note元素可包含出现零次或多次的
PCDATA、"to"、"from"、"header" 或者 "message"
四、DTD属性
DTD总属性通过ATTLIST来进行声明,使用下面语法:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
例如:
DTD的实例:
<!ATTLIST payment type CDATA "check">
XML的实例:
<payment type="check"/>
关于属性类型的选项大家可以上网搜索,这里不再做赘述。
五、DTD实体
所谓DTD实体适用于定义引用普通文本或特殊字符的快捷方式的变量,实体可以在内部或者外部进行声明,下面我们分别举例:
1、一个内部实体声明,遵从语法规则为:<!ENTITY 实体名称 “实体的值”>
DTD的实例:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright google">
XML的实例:
<author>&writer;©right;</author>
2、一个外部实体声明,遵从语法规则为:<!ENTITY 实体名称 SYSTEM "URI/URL">
DTD的实例:
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
XML的实例:
<author>&writer;©right;</author>
关于DTD的内容暂时先了解到这里。