一、DTD 简介
1.文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
2.内部的 DOCTYPE 声明:<!DOCTYPE 根元素 [元素声明]>
带有 DTD 的 XML 文档实例
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)><!--定义 note 元素-->
<!ELEMENT to (#PCDATA)><!--定义元素类型-->
<!ELEMENT from (#PCDATA)><!--定义元素类型-->
<!ELEMENT heading (#PCDATA)><!--定义元素类型-->
<!ELEMENT body (#PCDATA)><!--定义元素类型-->
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
3.外部文档声明:<!DOCTYPE 根元素 SYSTEM "文件名">
一个外部的 DTD:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</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 构建模块
元素是 XML 以及 HTML 文档的主要构建模块。
XML 文档构建模块
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
- 元素
- 属性
- 实体
- PCDATA (PDATA 是会被解析器解析的文本)
- CDATA (CDATA 是不会被解析器解析的文本)
三、DTD - 元素
在一个 DTD 中,元素通过元素声明来进行声明。
1.声明一个元素
在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:
<!ELEMENT 元素名称 类别>
或者
<!ELEMENT 元素名称 (元素内容)>
2.空元素
空元素通过类别关键词EMPTY进行声明:
<!ELEMENT 元素名称 EMPTY>
3.只有 PCDATA 的元素:只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明
4.带有任何内容的元素
通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合
<!ELEMENT 元素名称 ANY>
5.带有子元素(序列)的元素:<!ELEMENT 元素名称 (子元素名称 1)>
6.声明最少出现一次的元素<!ELEMENT 元素名称 (子元素名称+)>
声明出现零次或多次的元素<!ELEMENT 元素名称 (子元素名称*)>
声明出现零次或一次的元素<!ELEMENT 元素名称 (子元素名称?)>
四、DTD - 属性
在 DTD 中,属性通过 ATTLIST 声明来进行声明。
1.声明属性
属性声明拥使用下列语法:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
2."square" 被定义为带有 CDATA 类型的 "width" 属性的空元素。如果宽度没有被设定,其默认值为0 。
<!ELEMENT square EMPTY><!ATTLIST square width CDATA "0">
3.使用关键词 #IMPLIED设置属性可有可无
<!ATTLIST 元素名称 属性名称 属性类型 #IMPLIED>
4.使用关键词 #REQUIRED设置属性值必须有
<!ATTLIST 元素名称 属性名称 属性类型 #REQUIRED>
5.使用 #FIXED 关键词设置固定的值
<!ATTLIST 元素名称 属性名称 属性类型 #FIXED "value">
五、DTD - 实体
实体是用于定义用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。
1.一个内部实体声明:<!ENTITY 实体名称 "实体的值">
注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。
2.一个外部实体声明:<!ENTITY 实体名称 SYSTEM "URI/URL">
六、DTD 验证
1.通过 XML 解析器进行验证
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="true"
xmlDoc.load("note_dtd_error.xml")
document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)
2.关闭验证
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="false"
xmlDoc.load("note_dtd_error.xml")
document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)
七、实例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE TVSCHEDULE [
<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER,DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>
<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>
]>
<TVSCHEDULE NAME="">
<CHANNEL CHAN="">
<BANNER>
</BANNER>
<DAY>
<DATE></DATE>
<HOLIDAY></HOLIDAY>
<PROGRAMSLOT VTR="">
<TIME></TIME>
<TITLE RATING="" LANGUAGE=""></TITLE>
<DESCRIPTION></DESCRIPTION>
</PROGRAMSLOT>
</DAY>
</CHANNEL>
</TVSCHEDULE>