DTD 教程
目录
目录参考自 W3School-DTD 教程
DTD简介
DTD 是什么?
了解一个新事物之前,需要先向自己提问。
DTD 全写为 Document Type Definition,意为”文档定义类型“。
DTD 是一套关于标记的语法规则,它说明了在 XML 中哪些标记可以使用、哪些标记具有属性以及使用标记出现的顺序是什么。
DTD肩负着两重任务:
- 帮助编写出合法的代码;
- 让浏览器正确地显示代码。
DTD 与 XML 的关系?
XML 解释器根据 DTD 来认识我们自定义的标记。在 DTD 中,说明了我们定义的标记的含义。
DTD 与 XML 的关系类似于类与对象、数据库表结构与记录。
为什么使用 DTD?
通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据。
DTD 分为内部 DTD、外部 DTD和内外部结合的 DTD。
内部 DTD
内部 DTD 位于 XML 文档中的一个 DOCTYPE 声明中:
<!DOCTYPE 根元素 [元素声明]>
XML 实例:
<?xml version="1.0"?>
<!DOCTYPE note [ 定义此文档是 note 类型的文档
<!ELEMENT note (to,from,heading,body)> 定义 note 元素有四个元素:"to、from、heading,、body"
<!ELEMENT to (#PCDATA)> 定义 to 元素为 "#PCDATA" 类型
<!ELEMENT from (#PCDATA)> 定义 from 元素为 "#PCDATA" 类型
<!ELEMENT heading (#PCDATA)> 定义 heading 元素为 "#PCDATA" 类型
<!ELEMENT body (#PCDATA)> 定义 body 元素为 "#PCDATA" 类型
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
外部 DTD
外部 DTD 位于 XML 文档外部:
<!DOCTYPE 根元素 SYSTEM "文件名">
XML 实例:
<?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>
note.dtd 文件:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
XML 构建模块
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
- 元素
- 属性
- 实体
- PCDATA
- CDATA
下面是每个构建模块的简要描述。
元素
元素是 XML 以及 HTML 的主要构建模块,例如body
(HTML元素)或者note
(XML元素)
属性
属性位于某元素的开始标签中,以名/值对的形式出现。
实体
实体是用来定义普通文本的变量。实体引用是对实体的引用。
下面的实体在 XML 中被预定义:
实体引用 | 字符 |
---|---|
< | < |
> | > |
& | & |
" | " |
' | ' |
PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。
CDATA
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
DTD 元素
声明一个元素
<!ELEMENT 元素名称 类别>
<!ELEMENT 元素名称 (元素内容)>
空元素
<!ELEMENT 元素名称 EMPTY>
只有 PCDATA 的元素
<!ELEMENT 元素名称 (#PCDATA)>
带有任何内容的元素
<!ELEMENT 元素名称 ANY>
带有子元素(序列)的元素
<!ELEMENT 元素名称 (子元素名称 1)>
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>
声明只出现一次的元素
<!ELEMENT 元素名称 (子元素名称)>
声明最少出现一次的元素
<!ELEMENT 元素名称 (子元素名称+)>
声明出现零次或多次的元素
<!ELEMENT 元素名称 (子元素名称*)>
声明出现零次或一次的元素
<!ELEMENT 元素名称 (子元素名称?)>
声明“非.../既...”类型的内容
<!ELEMENT note (to,from,header,(message|body))>
上面的例子声明了:"note" 元素必须包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。
声明混合型的内容
<!ELEMENT note (#PCDATA|to|from|header|message)*>
上面的例子声明了:"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。
DTD 属性
DTD 属性声明
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
以下是属性类型的选项:
类型 | 描述 |
---|---|
CDATA | 值为字符数据 (character data) |
(en1|en2|..) | 此值是枚举列表中的一个值 |
ID | 值为唯一的 id |
IDREF | 值为另外一个元素的 id |
IDREFS | 值为其他 id 的列表 |
NMTOKEN | 值为合法的 XML 名称 |
NMTOKENS | 值为合法的 XML 名称的列表 |
ENTITY | 值是一个实体 |
ENTITIES | 值是一个实体列表 |
NOTATION | 此值是符号的名称 |
xml: | 值是一个预定义的 XML 值 |
默认值参数可使用下列值:
值 | 解释 |
---|---|
值 | 属性的默认值 |
#REQUIRED | 属性值是必需的 |
#IMPLIED | 属性不是必需的 |
#FIXED value | 属性值是固定的 |
DTD 实体
内部实体声明
<!ENTITY 实体名称 "实体的值">
外部实体声明
<!ENTITY 实体名称 SYSTEM "URI/URL">
DTD 例子:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
XML 例子:
<author>&writer;©right;</author>
注释: 一个实体由三部分构成: 一个和号 (&
), 一个实体名称, 以及一个分号 (;
)。