DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。它使用一系列的合法元素来定义文档结构。
为什么使用 DTD?
通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用:
1假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:
<!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>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
以上 DTD 解释如下:
!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
!ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型
!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型
2假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:
<!DOCTYPE 根元素 SYSTEM "文件名"> 例:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
这是包含 DTD 的 "note.dtd" 文件:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
· 元素 如:<body>body text in between</body>
· 属性 如:<img src="computer.gif" />
· 实体 如:" " 代表空格
· PCDATA 被解析的字符数据,可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本
· CDATA 字符数据,如标签不会被当作标记来对待,其中的实体也不会被展开
元素声明:
1空元素通过类别关键词EMPTY进行声明,如:<!ELEMENT br EMPTY>
XML例子:<br />
2只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明:<!ELEMENT from (#PCDATA)>
3通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:<!ELEMENT 元素名称 ANY>
4带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)> 如: <!ELEMENT note (to,from,heading,body)>
5 声明只出现一次的元素: <!ELEMENT 元素名称 (子元素名称)>
如:<!ELEMENT note (message)> ,message子元素必须出现一次,且必须只在 "note" 元素中出现一次。
6 声明最少出现一次的元素: <!ELEMENT 元素名称 (子元素名称+)>
7 声明出现零次或多次的元素:<! ELEMENT 元素名称 (子元素名称*)>
8 声明出现零次或一次的元素:<! ELEMENT 元素名称 (子元素名称?)>
9 声明“非.../既...”类型的内容:<! ELEMENT note (to,from,header,(message|body))>
上面的例子声明了:"note" 元素必须包含 "to" 元素、"from" 元素、"header" 元素,以及"message"或 "body" 元素。
DTD属性:
属性声明拥使用下列语法:<! ATTLIST 元素名称属性名称属性类型默认值>
DTD 实例:<!ATTLIST payment type CDATA "check">
XML 实例:<payment type="check" />
以下是属性类型的选项:
类型
描述
CDATA
值为字符数据 (character data)
(en1|en2|..)
此值是枚举列表中的一个值
ID
值为唯一的 id
IDREF
值为另外一个元素的 id
IDREFS
值为其他 id 的列表
NMTOKEN
值为合法的 XML 名称
NMTOKENS
值为合法的 XML 名称的列表
ENTITY
值是一个实体
ENTITIES
值是一个实体列表
NOTATION
此值是符号的名称
xml:
值是一个预定义的 XML 值
默认值参数可使用下列值:
值
解释
值
属性的默认值
#REQUIRED
属性值是必需的
#IMPLIED
属性不是必需的
#FIXED value
属性值是固定的
实体:
实体是用于定义用于定义引用普通文本或特殊字符的快捷方式的变量。
1 一个内部实体声明:<!ENTITY 实体名称 "实体的值">
DTD 例子: <!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
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 验证:
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="true" //若设为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)
DTD
最新推荐文章于 2025-09-08 11:30:57 发布