深入解析XML中的DTD文档类型定义

所属分类: 网页制作 / XML/XSLT 阅读数: 1707
收藏 0 赞 0 分享

XML 文档类型定义,俗称 DTD,它是一种准确描述 XML 语言的方式。DTDs 根据适当 XML 语言的语法规则检查 XML 文档的词汇和结构的有效性。

XML DTD 可以指定在文档内部,也可以保存在独立的文档中然后单独链接。

语法
DTD 的基本语法如下所示:

XML/HTML Code复制内容到剪贴板
  1. <!DOCTYPE element DTD identifier   
  2. [   
  3.     declaration1   
  4.     declaration2   
  5.     ........   
  6. ]>  

上述语法中:

DTD 以 <!DOCTYPE 定界符开始。
element 用于告诉解析器从指定的根元素开始解析文档。
DTD identifier 是一个用于文档类型定义的标示符,它可以是一个指向系统中某个文件的路径或者连接到互联网上某个文件的 URL。如果 DTD 指向外部路径,则被称为外部子集。 _ [] 内是一个可选的实体声明列表,被称为内部子集。
内部 DTD
如果一个元素声明在 XML 文档的内部则 DTD 被称为内部 DTD。为了把它作为内部 DTD,XML 声明中的 standalone 属性必须设置为 yes。这意味着,声明的工作独立于外部源。

语法

内部 DTD 语法如下所示:

XML/HTML Code复制内容到剪贴板
  1. <!DOCTYPE root-element [element-declarations]>  

这里 root-element 是根元素的名称,element-declarations 表示我们声明的元素。

示例

下面是一个内部 DTD 的简单示例:

XML/HTML Code复制内容到剪贴板
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>  
  2. <!DOCTYPE address [   
  3. <!ELEMENT address (name,company,phone)>  
  4.     <!ELEMENT name (#PCDATA)>  
  5.     <!ELEMENT company (#PCDATA)>  
  6.     <!ELEMENT phone (#PCDATA)>  
  7. ]>  
  8. <address>  
  9.     <name>Tanmay Patil</name>  
  10.     <company>TutorialsPoint</company>  
  11.     <phone>(011) 123-4567</phone>  
  12. </address>  

我们来看一下上面的代码:

开始声明 - 使用如下语句开始 XML 声明:

XML/HTML Code复制内容到剪贴板
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>  

DTD - 紧跟在 XML 头后面,_文档类型声明_如下,通常被称为 DOCTYPE:

<!DOCTYPE address [
DOCTYPE 声明在元素名称的开头包含一个感叹号(!)。DOCTYPE 会通知解析器有一个 DTD 与这个文档相关联。

DTD Body - DOCTYPE 声明后面紧跟 DTD 体,这里我们声明元素,属性,实体和符号:

XML/HTML Code复制内容到剪贴板
  1. <!ELEMENT address (name,company,phone)>  
  2. <!ELEMENT name (#PCDATA)>  
  3. <!ELEMENT company (#PCDATA)>  
  4. <!ELEMENT phone_no (#PCDATA)>  

许多元素都在这里通过 <name> 文档词汇声明。<!ELEMENT name (#PCDATA)> 定义元素_名称_为 "#PCDATA" 类型。这里 #PCDATA 意味着可解析的文本数据。

结束声明 - 最后,DTD 的声明部分使用方括号和尖括号(]>)闭合。这是一个有效的结束定义,后面紧跟的就是 XML 文档内容。

规则

文档类型声明必须出现在文档的开头部分(只先与 XML 头),不允许出现在文档的任意其他位置。
类似于 DOCTYPE 声明,元素声明必须以感叹号开始。
文档类型声明中的 Name 必须与根元素的类型匹配。
外部 DTD
在外部 DTD 中元素声明在 XML 文档的外部。通过指定 system 属性来访问,这个属性值可以是合法的 .dtd 文件或者有效的 URL。为了指示它是外部 DTD,XML 声明的 standalone 属性必须设置为 no。这就意味着,声明包含来自外部源的信息。

语法

下面是外部 DTD 的语法:

<!DOCTYPE root-element SYSTEM "file-name">
这里 file-name 就是 .dtd 扩展的文件。

示例

下面的示例展示了外部 DTD 的用法:

XML/HTML Code复制内容到剪贴板
  1. <?xml version="1.0" encoding="UTF-8" standalone="no" ?>  
  2. <!DOCTYPE address SYSTEM "address.dtd">  
  3. <address>  
  4.     <name>Tanmay Patil</name>  
  5.     <company>TutorialsPoint</company>  
  6.     <phone>(011) 123-4567</phone>  
  7. </address>  
  8. DTD 文件 address.dtd 的内容如下所示:   
  9.   
  10. <!ELEMENT address (name,company,phone)>  
  11. <!ELEMENT name (#PCDATA)>  
  12. <!ELEMENT company (#PCDATA)>  
  13. <!ELEMENT phone (#PCDATA)>  

类型

我们可以通过使用系统标示符或者公共标示符引用一个外部DTD。

系统标示符

系统标示符允许我们指定包含 DTD 声明的外部文件的位置。语法如下:

XML/HTML Code复制内容到剪贴板
  1. <!DOCTYPE name SYSTEM "address.dtd" [...]>  

正如我们可以看到的,它包含 SYSTEM 关键字和一个指向文档位置的 URI 引用。

公共标示符

公共标示符提供了一种定位 DTD 资源的机制,写法如下:

XML/HTML Code复制内容到剪贴板
  1. <!DOCTYPE name PUBLIC "-//Beginning XML//DTD Address Example//EN">  

正如我们可以看到的,它以 PUBLIC 关键字开始,后面紧跟的是专门的标识符。公共标识符被用来标识目录中的条目。公共标识符可以遵循任意格式,但是常用的格式是正式公用标识符(或者 FPIs)。


声明元素
在dtd中声明元素(在一个xml如果一个元素想要让它是合法的,则需要在dtd中声明)
      语法:<!ELEMENT 元素名称 类别>和<!ELEMENT 元素名称 (元素内容)>这两种方式
<!ELEMENT 元素名称 EMPTY>

例如:

XML/HTML Code复制内容到剪贴板
  1. <!ELEMENT br EMPTY>  

则xml可以写成:

XML/HTML Code复制内容到剪贴板
  1. <br/>  

注意点
在dtd中
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
元素
属性
实体
PCDATA
CDATA
下面是一些注意点:
(1)实体是用来定义普通文本的变量。实体引用是对实体的引用。
大多数同学都了解这个 HTML 实体引用:"&nbsp;"。这个“无折行空格”实体在 HTML 中被用于在某个文档中插入一个额外的空格。
当文档被 XML 解析器解析时,实体就会被展开。
2016215112449921.jpg (612×194)

(2) PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器解析成实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &amp;、&lt; 以及 &gt; 实体来分别替换它们。
(3)CDATA
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

更多精彩内容其他人还在看

初学XML的基础知识(认识XML的作用)

“可扩展标记语言”(XML) 提供一种描述结构化数据的方法。与主要用于控制数据的显示和外观的 HTML 标记不同,XML 标记用于定义数据本身的结构和数据类型。 XML 使用一组标记来描绘数据元素。每个元素封装可能十分简单也可能十分复杂的数据。您可
收藏 0 赞 0 分享

使用XML实现多渠道接入网站的构架

  其实写这篇文章的目的最多的想法是把自己在去年在瑞士做项目时应用的一个框架给展现出来让大家共享,但我又有点担心我的表达能力不能将我在里面使用的思想很好的表现出来,所以迟迟 不敢下笔,最后还是下了决心,写吧, 不行就在好好改改,当然也希望大家多提些意见。
收藏 0 赞 0 分享

学习XML关于图像超链接的制作

这是我今天学习的时候遇到的另一个问题,做图像超链接要把链接地址放到<a>的href属性中去,可是这就是在标签中套标签,是不可以的,查了《Web编程实做教程》,才知道正确的解决方案,现在与大家分享。 此段代码运行需要两张图片:a.gif和b.gif。 my
收藏 0 赞 0 分享

Microsoft的XMLHTTP对象介绍

MSXML中提供了Microsoft.XMLHTTP对象,能够完成从数据包到Request对象的转换以及发送任务。 创建XMLHTTP对象的语句如下: Set objXML = CreateObject("Msxml2.XMLHTTP") 或 Set
收藏 0 赞 0 分享

了解WEB页面工具语言XML(六)展望

六、XML展望   任何一项新技术的产生都是有其需求背景的,XML的诞生是在HTML遇到不可克服的困难之后。近年来HTML在许多复杂的Web应用中遇到了问题,要彻底解决这些问题,必须用功能强大的XML来替代HTML作为Web页面的书写工具。XML有利于信息的表达和结构化组
收藏 0 赞 0 分享

了解WEB页面工具语言XML(五)好处

五、XML带来的好处   (1)更有意义的搜索   数据可被XML唯一的标识。没有XML,搜索软件必须了解每个数据库是如何构建的。这实际上是不可能的,因为每个数据库描述数据都是不同的。有了XML,书就可以很容易以标准的方式按照作者、标题、ISBN序号或其他的标准分
收藏 0 赞 0 分享

用XML将机器内码转换为人们容易理解的信息

  程序中通常会有一些错误代码或标识,为了程序中方便这些东西通常不会使用汉字,经常在程序中用的是一些FileError或数字。还有就是在编码中经常使用的枚举标识对象的状态。而通常这些信息会直接的或间接的现实给用户,可用户需要到的是容易理解的汉字描述。以前要么将这
收藏 0 赞 0 分享

历数Firefox2.0对XML处理的改进

Firefox 2.0 在对 XML 的支持方面有几个重要的改进。目前它的用户部署如日中天。了解 Firefox 2.0 XML 特性的改进,包括在 RSS Web 提要处理方面有争议的变化。 被赋予新应用程序平台的角色后,现在 Web 浏览器可能是最热门的软件。对于软件开
收藏 0 赞 0 分享

将XML数据转换成HTM

使用一个简单的XSL样式表就可以将XML数据转换成HTML。随着XML规范的不断演进,在新的版本中满足每个人的需要似乎已经成为必要;假设有一个表示一个页面内容的XML数据,现在想将其内容转换成布局。下面是想要转换的XML:
收藏 0 赞 0 分享

(javascript+asp)XML、XSL转换输出HTML

Javascript客户端转换 [code] <html> <body> <script language="javascript"> // Load XML var xml = new ActiveXObject
收藏 0 赞 0 分享
查看更多