XML中的DTD文档类型定义完全解析

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

一、何为DTD
DTD的全称为Document Type Definition,是一种文件定义格式,它规定了XML文件结构为XML文件提供了语法与规则。在DTD中定义XML文件的结构,然后按照DTD的声明来编写XML文件。它就好像编程语言中的函数定义,在使用函数时要根据函数声明的格式进行来引用。
2016624115119673.png (323×176)

二、DTD详解
1、实例详解

XML/HTML Code复制内容到剪贴板
  1. <?xml version='1.0' encoding='utf-8'?>     
  2. <!-- 声明内部DTD -->     
  3. <!DOCTYPE 影片目录[     
  4.        <!ELEMENT 影片目录 (影片)+>   <!-- 声明XML顶层元素的子元素“影片”,“+”表示有一个或多个影片子元素 -->     
  5.        <!ELEMENT 影片 (片名,主演,导演,简介)>     <!-- 声明“影片”元素的子元素 -->     
  6.        <!ATTLIST 影片 类别 CDATA "动作" 年份 CDATA #REQUIRED> <!-- 声明“影片”元素的属性,两属性分别为“类别”和“年份”,CDATA说明属性的类型为字符型 -->     
  7.        <!ENTITY 十面埋伏 "漫天大雪,三人在雪中决斗">   <!-- 实体的声明,类型为字符型,在下面使用“&实体名称;”直接引用 -->     
  8.        <!ENTITY 霍元甲 "民族英雄,与西方帝国主义抗争">     
  9.        <!ELEMENT 片名 (#PCDATA)>     
  10.        <!ELEMENT 主演 (#PCDATA)>     
  11.        <!ELEMENT 导演 (#PCDATA)>     
  12.        <!ELEMENT 简介 (#PCDATA)>     
  13. ]>     
  14. <!-- 由DTD获得的XML -->     
  15. <影片目录>     
  16.    <影片 类别="武侠" 年份="2008">     
  17.          <片名>十面埋伏</片名>     
  18.          <主演>刘德华、金城武、章子怡</主演>     
  19.          <导演>张艺谋</导演>     
  20.          <简介>&十面埋伏;</简介>     
  21.    </影片>     
  22.    <影片 类别="武侠" 年份="2006">     
  23.        <片名>霍元甲</片名>     
  24.        <主演>李连杰</主演>     
  25.        <导演>于仁泰</导演>     
  26.        <简介>&霍元甲;</简介>     
  27.    </影片>     
  28. </影片目录>    

1.1 DTD声明开始语句

(1)内部声明:<!DOCTYPE [具体的DTD语句]>
(2)外部声明:<!DOCTYPE 引用的DTD的根元素 关键字(SYSTEM/PUBLIC) "dtd文件名称/dtd文件的网络地址">
对于外部声明有多种形式,主要分为SYSTEM和PUBLIC类型的文件。
SYSTEM:一个作者或组织编写的众多XML文档中通用的DTD;
PUBLIC:由权威机构制定,提供给特定行业或公众使用的DTD。
1.2 其它声明
(1)元素:

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

(2)属性列表:

XML/HTML Code复制内容到剪贴板
  1. <!ATTLIST Element_Name   
  2.    Attribute_Name Type [added_declare]   
  3.    Attribute_Name Type [added_declare]   
  4.    ......   
  5. >  

(3)实体
内部
一般:<!ENTITY Entity_Name Entity_Value>
参数:<!ENTITY Entity_Name SYSTEM Entity_URL>
外部
一般:<!ENTITY % Entity_Name Entity_Value>
参数:<!ENTITY % Entity_Name SYSTEM Entity_URL>

2、内容详解
2.1 元素声明
2016624115142958.png (442×446)

在元素声明中需要注意的主要是几种特殊的元素声明和子元素出现的次数、选择性、混合型,它们的作用类似于编程语言中的算数和逻辑运算符。如下,为具有多种元素的DTD实例。

XML/HTML Code复制内容到剪贴板
  1. <?xml version='1.0' encoding='utf-8'?>     
  2. <!DOCTYPE 影片目录 [     
  3.     <!ELEMENT 影片目录 (影片,其它,说明)+>   <!-- 使用“+”号表明影片目录中的子元素出现至少一次 -->     
  4.     <!ELEMENT 其它 EMPTY>   <!-- 使用EMPTY关键字声明空元素 -->     
  5.     <!ELEMENT 说明 ANY>     <!-- 使用ANY关键字声明任何内容的元素 -->     
  6.     <!ELEMENT 影片(片名,主演,导演,简介)>    <!-- 含有子元素的元素声明格式 -->      
  7.     <!ATTLIST 影片      
  8.                     名称 ID #FIXED "十面埋伏"     
  9.                     类别 CDATA "动作"      
  10.                     年份 CDATA #REQUIRED     
  11.                     票房 CDATA #IMPLIED     
  12.      
  13.     >    <!-- 属性声明 -->     
  14.     <!ENTITY introduction "漫天大雪,三人在雪中决斗">     
  15.     <!ELEMENT 片名(#PCDATA)>     
  16.     <!ELEMENT 主演(#PCDATA)>     
  17.     <!ELEMENT 导演(#PCDATA)>     
  18.     <!ELEMENT 简介(#PCDATA)>     
  19. ]>    

想要深入了解元素声明的基本语法,请下载该导图。
2.2 命名冲突

在一个复杂的XML文档中有的时候会出现同名的元素,为了避免这种现象引入了命名空间和前缀标识。
2.2.1 命名空间
使用xmlns来引入命名空间,告诉用户哪一部分是属于该空间内的。在作用上它和其它编程语言中的命名空间有点类似,确保了元素的唯一性,避免发生冲突。

XML/HTML Code复制内容到剪贴板
  1. <?xml version="1.0" encoding='utf-8'?>     
  2. <影片 xmlns:h='http://www.abc.edu' xmlns:c='http://www.123.edu'><!-- 使用xmlns:来引用命名空间 -->     
  3.   <db>     
  4.     <h:table>werer</h:table>    <!-- 告诉用户,此table是在http://www.abc.edu中定义的 -->     
  5.     <c:table>fdfdsfsdf</c:table>    <!-- 告诉用户,此table是在http://www.123.edu中定义的 -->     
  6.   </db>     
  7. </影片>   

 

作用:标准化元素和属性,并为它们加上唯一标志;确保元素名称中没有冲突,并阐明了它们的来源。
2.2.2 前缀标识
在元素名和属性名前增加一个标识,以唯一区分当前元素或属性来自哪一个DTD,它常常和命名空间联合使用,如上例中的<h:table>和<c:table>。

三、实体详解

有了元素为什么还要引入实体呢?要想区分两者,首先要看实体引入的目的。实体机制是一种节省大量时间的工具,将多种不同类型的数据并入XML文档的方法。它就好像是面向对象的抽象类一样,把经常使用的抽象成一个实体,在使用它的地方可以直接引用,避免了重复。
详细的说
(1)代替无法输入的字符,键盘只有26个字母和一些简单的标点符号,而字符集中有成N多各种符号是无法在键盘中输入的。
(2)代替一些与xml规范保留字相冲突的内容,如:< > 等等。
(3)代替大段的重复的文本。
实体引用按照引用的位置分为内部和外部两种,按照引用的内容分为一般和参数引用两种。下面看一个外部实体引用的实例:

清单1:“2.dtd”的声明

XML/HTML Code复制内容到剪贴板
  1. <!-- 声明外部DTD,并保存为2.dtd -->     
  2.       
  3. <!ELEMENT 影片目录 (影片)+>     
  4. <!ELEMENT 影片 (片名,主演,导演,简介)>     
  5. <!ATTLIST 影片 类别 CDATA "动作" 年份 CDATA #REQUIRED>     
  6. <!ENTITY 十面埋伏 "漫天大雪,三人在雪中决斗">     
  7. <!ENTITY 霍元甲 "民族英雄,与西方帝国主义抗争">     
  8. <!ELEMENT 片名 (#PCDATA)>     
  9. <!ELEMENT 主演 (#PCDATA)>     
  10. <!ELEMENT 导演 (#PCDATA)>     
  11. <!ELEMENT 简介 (#PCDATA)>     
  12. <!ENTITY filmcomment SYSTEM "影评.xml">       <!-- 引用外部通用实体,文件名称为“影评.xml” -->    

清单2:影评.xml的内容

XML/HTML Code复制内容到剪贴板
  1. <?xml version="1.0" encoding='utf-8'?>     
  2. <影评>     
  3.  这些影评都是由XXX公司出品,值得观看!     
  4. </影评>    

清单3:使用dtd的xml文件中的内容。

XML/HTML Code复制内容到剪贴板
  1. <?xml version="1.0" encoding='utf-8'?>     
  2. <影评>     
  3.  这些影评都是由XXX公司出品,值得观看!     
  4. </影评>    


清单3:使用dtd的xml文件中的内容。  

XML/HTML Code复制内容到剪贴板
  1. <?xml version="1.0" encoding='utf-8'?>     
  2. <!DOCTYPE 影片目录 SYSTEM "./2.dtd" >     
  3. <影片目录>     
  4.     <影片 类别="武侠" 年份="2008">     
  5.         <片名>十面埋伏</片名>     
  6.         <主演>刘德华、金城武、章子怡</主演>     
  7.         <导演>张艺谋</导演>     
  8.         <简介>&十面埋伏;</简介>     
  9.     </影片>     
  10.     <影片 类别="武侠" 年份="2006">     
  11.         <片名>霍元甲</片名>     
  12.         <主演>李连杰</主演>     
  13.         <导演>于仁泰</导演>     
  14.         <简介>&霍元甲;</简介>     
  15.     </影片>     
  16.      &filmcomment;     
  17. </影片目录>    

     
清单4:使用IE8打开清单3后的内容

XML/HTML Code复制内容到剪贴板
  1. <?xml version="1.0" encoding="utf-8" ?>     
  2.   <!DOCTYPE 影片目录 (View Source for full doctype...)>     
  3. <影片目录>     
  4. -   <影片 类别="武侠" 年份="2008">     
  5.        <片名>十面埋伏</片名>     
  6.        <主演>刘德华、金城武、章子怡</主演>     
  7.        <导演>张艺谋</导演>     
  8.        <简介>漫天大雪,三人在雪中决斗</简介>     
  9.     </影片>     
  10. -   <影片 类别="武侠" 年份="2006">     
  11.        <片名>霍元甲</片名>     
  12.        <主演>李连杰</主演>     
  13.        <导演>于仁泰</导演>     
  14.        <简介>民族英雄,与西方帝国主义抗争</简介>     
  15.     </影片>     
  16.     <影评>这些影评都是由XXX公司出品,值得观看!</影评>     
  17.   </影片目录>    

内部和外部很容易理解,主要看一般和参数两种引用的区别。

1.参数实体

清单1:test.dtd,在此该内容单独存在了一个dtd文件中是因为在内部DTD子集中。
参数实体引用不能在标记声明内部出现,可以在标记声明允许出现的地方出现。然而,对于外部DTD子集,则没有这个限制。
XML/HTML Code复制内容到剪贴板

  1. <!-- 声明外部DTD,并保存为test.dtd -->     
  2. <!-- 个人信息实体声明的是参数类型的,可以再各个元素中共同使用该参数 -->     
  3. <!ENTITY % 个人信息 "(姓名,性别,出生日期)">     
  4. <!ELEMENT 学生信息 %个人信息;>     
  5. <!ELEMENT 教师信息 %个人信息;>     
  6. <!ELEMENT 员工信息 %个人信息;>    


清单2:学校信息.xml文件,引用了外部的test.dtd文件

XML/HTML Code复制内容到剪贴板
  1. <?xml version='1.0' encoding='utf-8'?>     
  2. <!-- 学校信息.xml文件 -->      
  3. <!-- 引用外部DTD -->     
  4. <!DOCTYPE 学校信息 SYSTEM './test.dtd'>     
  5. <!-- 由DTD获得的XML -->     
  6. <学校信息>     
  7.  <学生信息>     
  8.   <姓名>张三</姓名>     
  9.   <性别></性别>     
  10.   <出生日期>2013-10-12</出生日期>     
  11.  </学生信息>     
  12.  <教师信息>     
  13.   <姓名>张三</姓名>     
  14.   <性别></性别>     
  15.   <出生日期>2013-10-12</出生日期>     
  16.  </教师信息>     
  17.  <员工信息>     
  18.   <姓名>张三</姓名>     
  19.   <性别></性别>     
  20.   <出生日期>2013-10-12</出生日期>     
  21.  </员工信息>     
  22. </学校信息>    

       
清单3:使用IE8打开清单2的内容后

XML/HTML Code复制内容到剪贴板
  1. <?xml version="1.0" encoding="utf-8" ?>     
  2. <!--   
  3.  声明内部DTD    
  4.   -->     
  5.   <!DOCTYPE 学校信息 (View Source for full doctype...)>     
  6. <!--   
  7.  由DTD获得的XML    
  8.   -->     
  9. <学校信息>     
  10. -    <学生信息>     
  11.        <姓名>张三</姓名>     
  12.        <性别></性别>     
  13.        <出生日期>2013-10-12</出生日期>     
  14.      </学生信息>     
  15. -    <教师信息>     
  16.         <姓名>张三</姓名>     
  17.         <性别></性别>     
  18.         <出生日期>2013-10-12</出生日期>     
  19.      </教师信息>     
  20. -    <员工信息>     
  21.         <姓名>张三</姓名>     
  22.         <性别></性别>     
  23.         <出生日期>2013-10-12</出生日期>     
  24.      </员工信息>     
  25.   </学校信息>    

 
2. 一般实体

可在XML元素中加以引用,也可以在DTD中引用,但参数实体只能在DTD中引用,并且通常情况下只能在外部DTD文档中引用。

3. 对比升华

参数实体与一般实体的区别如下:

     (l)在定义参数实体时,实体名前必须加一个“%”号。

     (2)参数实体引用以“%”开始,而不是一般实体引用的“&”。

     (3)参数实体的内容不仅可以包含文本,还可以包含标记。

     (4)参数实体只能应用于DTD,而不能在文档本体中引用。即参数实体只能用来构成DTD的内容,而不能构成文档内容。

     (5)参数实体只能在外部DTD文档中使用,无法应用于内部DTD。


外部参数实体与外部一般实体的区别如下:

     (1)外部参数实体应用于独立的DTD文档,外部一般实体应用于XML文档。

     (2)外部参数实体应用于将多个独立的DTD文档组合为一个大的DTD文档,外部一般实体用于将多个独立的XML文档组合成一个大的XML文档。


四、验证XML文件的合法性

DTD定义了XML文件的使用格式,它从结构和形式上限制了XML文档,通过引用DTD可以形成统一的规范化的XML文档,另外通过使用实体简化了DTD和XML文档的内容。使用DTD验证的XML文档才能称为规范化文档,那如何验证所写的XML文档是否符合DTD的规范呢。通过如下的代码串:

Java Code复制内容到剪贴板
  1. import javax.xml.parsers.DocumentBuilder;     
  2. import javax.xml.parsers.DocumentBuilderFactory;     
  3.      
  4. import org.xml.sax.InputSource;     
  5.      
  6. public class ValidateDTD     
  7. {     
  8.     public static void main(String[] args){     
  9.              
  10.         //在验证前需要把需要验证的XML和规范DTD包含在jar中     
  11.         try{     
  12.             DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();    //创建一个文档构造工厂     
  13.             dbf.setValidating(true);     
  14.             DocumentBuilder builder=dbf.newDocumentBuilder();     
  15.             builder.parse(new InputSource("xml-2-2.xml"));  //需要验证的XML名称     
  16.         }catch(Exception e){     
  17.             e.printStackTrace();     
  18.         }     
  19.     }     
  20. }    

上面代码中的类和结构主要完成了XML文档的解析,并且在解析之前验证当前XML文件是否符合某个DTD的定义。在上面的代码运行前需要将需要验证的XML和提供规范化的DTD文档引入到当前ValidateDTD项目中,后运行上面的代码实例,该项目会在项目文件中自动查找规范的DTD,然后验证xml文件。

五、结语
至此,有关文件定义格式的内容已经基本上讨论了一遍,从最初的元素声明到复杂多变的实体类型,DTD的引入无疑为XML的使用指定了一个统一的标准,这种标准是由提供方规定好,使用方遵守的一种规则,并在最后讨论了如何验证引用DTD的XML合法与否。另外描述XML文档结构的不仅仅只有DTD,DTD是一种早期的定义格式,它有很多缺点,如不支持数据类型,不易于扩展等,为了避免这种缺点后来又引入了Schema,它是DTD的继任者,下篇博客将着重讨论Schema。

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

初学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 分享
查看更多