MENU

DTD 相关知识

December 18, 2018 • 编程开发

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档结构

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

DTD 简介

1. 内部的 DOCTYPE 声明

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE 根元素 [元素声明]>

带有 DTD 的 XML 文档实例(请在 IE5 以及更高的版本打开,并选择查看源代码):

<?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" 类型

关于PCDATA的知识可以回顾这里:PCDATA

2. 外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE 根元素 SYSTEM "文件名">

这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD: (在 IE5 中打开,并选择“查看源代码”命令。)

<?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)>

3. 为什么使用 DTD?

  • 通过 DTD,每一个 XML 文件均可携带一个有关其自身格式的描述。
  • 通过 DTD,大家可一致地使用某个标准的 DTD 来交换数据。
  • 应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
  • 可以使用 DTD 来验证自身的数据。

说白了就是对XML进行验证和规范的,毕竟XML是自己可以定义的,太灵活所以需要进行规范和检查。

DTD - XML 构建模块

XML 以及 HTML 文档的主要构建模块是类似 <body>....</body> 这样的标签。

1. XML 文档构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素
  • 属性
  • 实体
  • PCDATA
  • CDATA

元素

元素是 XML 以及 HTML 文档的主要构建模块。

HTML 元素的例子是 "body" 和 "table"。XML 元素的例子是 "note" 和 "message" 。元素可包含文本、其他元素或者是空的。空的 HTML 元素的例子是 "hr"、"br" 以及 "img"。

属性

属性可提供有关元素的额外信息。

属性总是被置于某元素的开始标签中。属性总是以名称/值的形式成对出现的。下面的 "img" 元素拥有关于源文件的额外信息:

实体

实体是用来定义普通文本的变量。实体引用是对实体的引用。

大多数同学都了解这个 HTML 实体引用:" "。这个“无折行空格”实体在 HTML 中被用于在某个文档中插入一个额外的空格。

当文档被 XML 解析器解析时,实体就会被替换

PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。

可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

文本中的标签会被当作标记来处理,而实体会被展开。不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。

CDATA

CDATA 的意思是字符数据(character data)。

CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

DTD - 元素

在一个 DTD 中,元素通过元素声明来进行声明。

1. 声明一个元素

在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:

<!ELEMENT 元素名称 类别>

<!ELEMENT 元素名称 (元素内容)>

2. 各类DTD元素

空元素

通过类别关键词EMPTY进行声明:

<!ELEMENT 元素名称 EMPTY>

<!ELEMENT br EMPTY> <br />

只有 PCDATA 的元素

只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明:

<!ELEMENT 元素名称 (#PCDATA)>

带有任何内容的元素

通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:

<!ELEMENT 元素名称 ANY>

带有子元素(序列)的元素

带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:

<!ELEMENT 元素名称 (子元素名称 1)>

<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>

例如:

<!ELEMENT note (to,from,heading,body)>

当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。"note" 元素的完整声明是:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to      (#PCDATA)>
<!ELEMENT from    (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body    (#PCDATA)>

声明元素出现的次数

  • 声明只出现一次的元素
    <!ELEMENT 元素名称 (子元素名称)>
  • 声明最少出现一次的元素
    <!ELEMENT 元素名称 (子元素名称+)>
  • 声明出现零次或多次的元素
    <!ELEMENT 元素名称 (子元素名称*)>
  • 明出现零次或一次的元素
    <!ELEMENT 元素名称 (子元素名称?)>
  • 声明“非.../既...”类型的内容
    <!ELEMENT note (to,from,header,(message|body))>
  • 声明混合型的内容
    <!ELEMENT note (#PCDATA|to|from|header|message)*>

DTD - 属性

在 DTD 中,属性通过 ATTLIST 声明来进行声明。

1. 声明属性

属性声明使用下列语法:

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

以下是属性类型的选项:

类型描述
CDATA值为字符数据 (character data)
ID值为唯一的 id
IDREF值为另外一个元素的 id
IDREFS值为其他 id 的列表
NMTOKEN值为合法的 XML 名称
NMTOKENS值为合法的 XML 名称的列表
ENTITY值是一个实体
ENTITIES值是一个实体列表
NOTATION此值是符号的名称
xml:值是一个预定义的 XML 值

DTD - 实体

实体是用于定义引用普通文本或特殊字符的快捷方式的变量

实体可在内部或外部进行声明。

1. 一个内部实体声明

<!ENTITY 实体名称 "实体的值">

<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">

对应的

<author>&writer;&copyright;</author>

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

2. 一个外部实体声明

<!ENTITY 实体名称 SYSTEM "URI/URL">

<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

<author>&writer;&copyright;</author>

DTD 验证

Internet Explorer 5.0 可根据某个 DTD 来验证您的 XML。

  • 通过 XML 解析器进行验证
    当您试图打开某个 XML 文档时,XML 解析器有可能会产生错误。通过访问 parseError 对象,就可以取回引起错误的确切代码、文本甚至所在的行。
  • 关闭验证
    通过把 XML 解析器的 validateOnParse 设置为 "false",就可以关闭验证。
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="false"
xmlDoc.load("note_dtd_error.xml")

document.write("<br>Error Code: ")
Tags: XML, DTD
Archives QR Code
QR Code for this page
Tipping QR Code