认识XML和熟练使用它是两种境界,想要熟练使用XML就必须进行一些练习,在实践中学习。上篇博客主要讨论了XML的基本语法结构,通过与HTML对比,对XML的认识更加深刻,并结合实例讲解了XML的基本语法结构,同时提到了其实XML也是一种编程语言,所以它也继承了编程语言的一些性质可以定义,最后简单引出了DTD,那今天就来看看DTD到底是什么。
一、何为DTD
DTD的全称为Document Type Definition,是一种文件定义格式,它规定了XML文件结构为XML文件提供了语法与规则。
在DTD中定义XML文件的结构,然后按照DTD的声明来编写XML文件。
它就好像编程语言中的函数定义,在使用函数时要根据函数声明的格式进行来引用。
二、DTD详解
1、实例详解
<?xml version='1.0' encoding='utf-8'?> <!-- 声明内部DTD --> <!DOCTYPE 影片目录[ <!ELEMENT 影片目录 (影片)+> <!-- 声明XML顶层元素的子元素“影片”,“+”表示有一个或多个影片子元素 --> <!ELEMENT 影片 (片名,主演,导演,简介)> <!-- 声明“影片”元素的子元素 --> <!ATTLIST 影片 类别 CDATA "动作" 年份 CDATA #required> <!-- 声明“影片”元素的属性,两属性分别为“类别”和“年份”,CDATA说明属性的类型为字符型 --> <!ENTITY 十面埋伏 "漫天大雪,三人在雪中决斗"> <!-- 实体的声明,类型为字符型,在下面使用“&实体名称;”直接引用 --> <!ENTITY 霍元甲 "民族英雄,与西方帝国主义抗争"> <!ELEMENT 片名 (#PCDATA)> <!ELEMENT 主演 (#PCDATA)> <!ELEMENT 导演 (#PCDATA)> <!ELEMENT 简介 (#PCDATA)> ]> <!-- 由DTD获得的XML --> <影片目录> <影片 类别="武侠" 年份="2008"> <片名>十面埋伏</片名> <主演>刘德华、金城武、章子怡</主演> <导演>张艺谋</导演> <简介>&十面埋伏;</简介> </影片> <影片 类别="武侠" 年份="2006"> <片名>霍元甲</片名> <主演>李连杰</主演> <导演>于仁泰</导演> <简介>&霍元甲;</简介> </影片> </影片目录>
1.1 DTD声明开始语句
(1)内部声明:
<!DOCTYPE [具体的DTD语句]>
对于外部声明有多种形式,主要分为SYSTEM和PUBLIC类型的文件。
SYSTEM:一个作者或组织编写的众多XML文档中通用的DTD;
PUBLIC:由权威机构制定,提供给特定行业或公众使用的DTD。
1.2 其它声明
(1)元素:
<!ELEMENT element_name element_definition>
(2)属性列表:
<!ATTLIST Element_Name
Attribute_Name Type [added_declare]
Attribute_Name Type [added_declare]
......
>
(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 元素声明
在元素声明中需要注意的主要是几种特殊的元素声明和子元素出现的次数、选择性、混合型,它们的作用类似于编程语言中的算数和逻辑运算符。如下,为具有多种元素的DTD实例。
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE 影片目录 [ <!ELEMENT 影片目录 (影片,其它,说明)+> <!-- 使用“+”号表明影片目录中的子元素出现至少一次 --> <!ELEMENT 其它 EMPTY> <!-- 使用EMPTY关键字声明空元素 --> <!ELEMENT 说明 ANY> <!-- 使用ANY关键字声明任何内容的元素 --> <!ELEMENT 影片(片名,简介)> <!-- 含有子元素的元素声明格式 --> <!ATTLIST 影片 名称 ID #FIXED "十面埋伏" 类别 CDATA "动作" 年份 CDATA #required 票房 CDATA #IMPLIED > <!-- 属性声明 --> <!ENTITY introduction "漫天大雪,三人在雪中决斗"> <!ELEMENT 片名(#PCDATA)> <!ELEMENT 主演(#PCDATA)> <!ELEMENT 导演(#PCDATA)> <!ELEMENT 简介(#PCDATA)> ]>想要深入了解元素声明的基本语法,请下载该导图。
2.2 命名冲突
在一个复杂的XML文档中有的时候会出现同名的元素,为了避免这种现象引入了命名空间和前缀标识。
2.2.1 命名空间
使用xmlns来引入命名空间,告诉用户哪一部分是属于该空间内的。在作用上它和其它编程语言中的命名空间有点类似,确保了元素的唯一性,避免发生冲突。
作用:标准化元素和属性,并为它们加上唯一标志;确保元素名称中没有冲突,并阐明了它们的来源。
<?xml version="1.0" encoding='utf-8'?> <影片 xmlns:h='http://www.abc.edu' xmlns:c='http://www.123.edu'><!-- 使用xmlns:来引用命名空间 --> <db> <h:table>werer</h:table> <!-- 告诉用户,此table是在http://www.abc.edu中定义的 --> <c:table>fdfdsfsdf</c:table> <!-- 告诉用户,此table是在http://www.123.edu中定义的 --> </db> </影片>
作用:标准化元素和属性,并为它们加上唯一标志;确保元素名称中没有冲突,并阐明了它们的来源。