XML三部曲之拨云见日DTD(一)



        认识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语句]>
   (2)外部声明: <!DOCTYPE 引用的DTD的根元素 关键字(SYSTEM/PUBLIC) "dtd文件名称/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>
</影片>

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

三、结语

      
        上面把XML语法中有关实体和元素及元素属性进行了讨论,其中着重讨论了元素和命名空间的内容,都是很简单的东西,但我们的讨论还没有结束,接下来将着重讨论DTD的实体。


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
[实验目的] 1、安装并学习如何使用XMLSPY集成开发环境完成XML相关的开发工作。 2、熟悉和掌握XML规范的基本内容,包括XML声明、注释、处理指令、元素、属性、CDATA段、预定义实体、命名空间的使用,以及如何进行XML文档良构和有效性验证;能够灵活地使用XML层次数据来表示各种信息。 3、掌握如何在DTD文档中声明元素及其内容模型、属性,以及实体的声明和使用;使用内部/外部DTD规则,对XML数据文档的有效性进行约束。 [实验内容和步骤] 1、安装XMLSPY集成开发环境,新建XMLDTD文档,在各种不同的编辑视图中尝试采用不同的方式完成XML文档的编辑和查看;并使用XMLSPY提供的便利,建立XMLDTD两者之间的关联,进行XML文档的良构以及有效性验证。 2、附件中提供了一个名为SpyBase的Excel文件,其中包含Alias、Mission和Spy三张数据表,请分别完成下列任务: ①.使用一个XML文档(SpyBase1.xml)来描述其中包含的所有信息,基本保持原有数据的形式(不要将三个表中的数据进行嵌套)。请使用XML文档的Grid视图完成该文档的编写(需使用Grid视图中提供的表操作工具条),并验证文档的良构性。结果示例如下图所示(该图仅供参考,要求对aID、mID、spyID必须使用XML属性,其他字段使用XML元素): ②.使用一个XML文档(SpyBase2.xml)来描述其中包含的所有信息,要求通过XML元素的正确嵌套消除数据之间的参照关系产生的冗余。请使用XML文档的Text或者Grid视图完成该文档的编写,并验证文档的良构性。 3、为第二步中得到的SpyBase1.xml、SpyBase2.xml分别编写相应的外部DTD文档,建立模式与数据之间的关联,并进行文档有效性验证。在编写的DTD文档中,要求在DTD文档中使用参数实体来替换所有的#PCDATA和CDATA。 [实验思考] 在本实验中发现,一个XML文档可以通过平面的形式、或者层次的形式来表示多个关系数据库中的二维表,那么哪种方式更合适,为什么? [提交时间及内容] 最后提交时间 2013年?月?日 提交内容 提交SpyBase1.xml、SpyBase2.xml。 提交SpyBase1.dtd、SpyBase2.dtd
[实验目的] 1、学习如何使用XMLSPY集成开发环境完成XML Schema相关的开发工作。 2、掌握XML Schema与DTD之间的区别,能够完成两者之间的转换;掌握在XML Schema中如何定义元素和属性,如何使用限制、列表和合并派生自己的简单数据类型,如何定义复杂数据类型,全局/局部元素和数据类型之间的区别;如何将XML Schema文档关联到XML实例数据文档,并完成文档的有效性验证。 3、掌握如何准确定义数据之间的参照完整性约束,如何在模式中使用多态性支持,如何在文档中定义空值等等。 [实验内容和步骤] 1、使用XMLSPY集成开发环境,新建XML Schema文档,在各种不同的编辑视图中尝试采用不同的方式完成XML Schema文档的编辑和查看;并使用XMLSPY提供的便利,建立XML、Schema两者之间的关联,进行XML文档的良构以及有效性验证。 2、严格按照下图给出的文档模型,在XML Schema编辑环境的Schema视图中完成book.xsd的编写(不要使用Text视图进行编写): 在上图中,没有指定简单类型元素和属性的数据类型,请根据合理的情况,完成数据类型的创建(至少使用到限制方式中的三种以上的限制方面),请在IDE的Details视图->type和Facets中完成上述任务。 在上图中,有三个title元素分别表示book、section和figure的标题,请定义下述类型: titleType:1-100个字符的文本; bookTitleType:titleType类型限制派生的子类型,要求取枚举值“Data On the Web”、“TCP/IP Illustrated”等; sectionTitleType:titleType类型限制派生的子类型,要求必须形如“1.xxxx”、“1-1.xxxx”等等(表示第一节、第一节下面的第一节等等,注意section是递归的形式); figureTitleType:titleType类型限制派生的子类型,要求必须形如“1-1.xxxx” 、“1-1-1.xxxx”(表示第一节中的第一个图、第一节下面的第一节的第一个图等等); 然后编写book.xml,并使用多态性(即所有title的类型均为titleType,而数据实例中指明具体类型),请确保通过文档有效性验证。 3、在上次的DTD实验中,我们编写了SpyBase1.xml、SpyBase2.xml、以及SpyBase1.dtd和SpyBase2.dtd,这次需要完成SpyBase1.xsd和SpyBase2.xsd,建立模式与数据之间的关联,并进行文档有效性验证。在编写的XSD文档SpyBase1.xsd中,要求使用key/keyref描述数据的实体完整性以及数据之间的参照完整性(SpyBase2.xml不需要,因为已经使用嵌套消除了参照关系)。 [实验思考] 与ID/IDREF相比,key/keyref有哪些优点,在使用上有何不同? 假设SpyBase1.xml中的alias、mission、spy来自不同的命名空间中,如何在Schema中对其进行限定,请在XMLSPY中完成相应的xsd文档?修改SpyBase1.xml,并验证新的SpyBase1_2.xsd是否正确? [提交时间及内容] 最后提交时间 2013年?月?日 提交内容 提交book.xsd、book.xml(使用多态)。 提交SpyBase1. xsd、SpyBase2. xsd。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值