第三章之DTD规范_第1页
第三章之DTD规范_第2页
第三章之DTD规范_第3页
第三章之DTD规范_第4页
第三章之DTD规范_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章之DTD规范规范的XML文件和有效的XML规范性仅仅是XML语言的基本语法,没有对XML文件怎样组织数据进行具体的限制。在某些系统中,如果不对XML怎样组织数据进行合理的约束,尽管写出XML文件没有任何语法错误(是规范的),但此XML文件对系统而言是没有实际价值的。本章讲解有效的XML.有效的XML文件概述对XML的数据结构进行限制有两种方式:使用文档类型定义(DocumentTypeDefinition,DTD)和XMLSchema模式。一个规范的XML文件如果和某个DTD文件相关联,并遵守该DTD文件规定的约束条件,就称之为有效的XML文件。3.1DTD基本概念

对XML文档所作的规范和约定被称为DTD,也就是文档类型定义。可以把DTD看作是编写某类XML文档的一个模板。在一个DTD中,具体规定了引用该DTD的XML文档可使用哪些标记、父元素中能够包括哪些子元素、各个元素出现的先后顺序、元素可包含的属性、元素和属性值的数据类型,以及可使用的实体及符号规则等。DTD的分类

一份DTD实际上是若干条有关元素、属性、实体等约束和声明语句的集合,这些语句可以包含在XML文档内部,被称为内部DTD;也可以独立保存为一个文件,而称为外部DTD,然后再将xml文件与该外部DTD文件关联。二者的差异主要在位置上。3.2内部和外部DTD

3.2.1内部DTD语法:<!DOCTYPE根元素名称[

DTD声明语句序列

]>其中:<!DOCTYPE:表示DTD声明的开始,关键字DOCTYPE必须大写。根元素名称:指定XML文档的根元素名称,这个根元素名称必须精确地与文档中实际的根元素名称一致。DTD声明语句序列:包含在一对方括号([])之内的若干条语句,用来对XML文档中所使用的元素、属性和实体等进行具体声明。在XML声明之后紧接着加入DTD描述内容书上例就是内部DTD的例子DTD的基本结构<!DOCTYPE客户名单[ <!--WritenbyYangling--> <!ELEMENT客户名单(客户)> <!ELEMENT客户(编号,客户地址,姓名,订单)> <!ELEMENT编号(#PCDATA)> <!ELEMENT客户地址(#PCDATA)> <!ELEMENT姓名(#PCDATA)> <!ELEMENT订单(#PCDATA)><!ATTLIST客户种类CDATA#REQUIRED>]>文档类型定义的结构说明“<!”为DTD定义的开始标记,“>”为DTD定义的结束标记,DOCTYPE为关键字,必须大写。“客户名单”为XML文档的根元素,规定一对中括号要放到根元素后面。“<!ELEMENT”为元素定义的开始标记,“>”为元素定义的结束标记。这部分内容是DTD中最主要的内容。在XML中不管是树枝节点还是树叶节点,都需要进行元素定义。“<!ATTLIST”为元素的属性定义。有一些元素具有属性,属性是为了在应用程序对文档进行处理时,提供参数或者控制信息。元素所有的属性都必须在DTD中进行定义。“<!--WritenbyYangling-->”为注释。与文档本体一样,DTD中也可以含有注释。内部DTD是很有用的,使用起来也很方便,不会因为找不到DTD文件而苦恼。但是内部DTD的引用会使XML源文档的长度剧增。另外,如果多个XML文档的结构相同,那么使用内部DTD就必须每个XML文档编写一个DTD,那么就会造成资源的浪费,代价非常昂贵。那么如何解决这个问题呢?3.2.2外部DTD1.外部DTD的创建外部DTD是一个独立于XML文档的文件,使用.dtd为其文件扩展名。此种文件实际上也是一个文本文件,可用任何文本编辑器创建。在外部DTD中,除了没有内部DTD中的“<!DOCTYPE根元素名称”语句之外,其他声明语句都是一样的。基本格式如下:<?xmlversion="1.0"encoding="gb2312"?>

元素、属性或实体的DTD描述外部DTD文件示例 <?xmlversion=“1.0”encoding=“gb2312”?><!ELEMENT客户名单(客户)> <!ELEMENT客户(编号,客户地址,姓名,订单)> <!ELEMENT编号(#PCDATA)> <!ELEMENT客户地址(#PCDATA)> <!ELEMENT姓名(#PCDATA)> <!ELEMENT订单(#PCDATA)><!ATTLIST客户种类CDATA#REQUIRED>2.在xml文档中引用外部DTD文件

在XML文件中引用外部DTD文件的基本格式如下:<?xmlversion="1.0"encoding="gb2312"?>

<!DOCTYPE根元素名SYSTEM"外部DTD文件名">……引用外部DTD文件示例<?xmlversion="1.0"encoding="gb2312"?><!DOCTYPE职工列表SYSTEM“3.2.dtd"><客户名单> <客户种类=“个人"> <编号>KH-0165</编号> <客户地址>重庆</客户地址> <姓名>任建兴</姓名> <订单>DD-345</订单> </客户></客户名单>3.3DTD对元素的声明

3.3.1元素声明的语法语法:<!ELEMENT元素标记名元素内容约束>说明:<!ELEMENT:元素声明语句的开始,关键字ELEMENT必须大写。元素标记名:所声明的元素名称。元素内容约束:对该元素内容的定义,用来规定该元素可以包含的内容。3.3.2各种元素内容的约束1.只包含子元素的约束2.只包含文本数据的约束3.包含混合内容的约束4.EMPTY和ANY<!ELEMENT客户(编号,客户地址,姓名,订单)><!ELEMENT姓名(#PCDATA)><!ELEMENT元素名(#PCDATA|子元素名1|子元素名2)*><!ELEMENT姓名EMPTY)>1.只包含子元素的约束如果想约束XML文件中某个元素标记可以有怎样的子标记(子元素),那么DTD中元素<!ELEMENT标记名称标记的约束条件>声明的“标记的约束条件”是用小括号括起的子标记列表,格式为

<!ELEMENT标记名称(子标记列表)>注:①“子标记列表”可以约束XML文件中的标记可以包含哪些子标记及这些子标记出现的先后顺序,这时“子标记列表”是用逗号隔开的若干个子标记,每个标记称为“子标记列表”的一个分项,例如<!ELEMENT开车时间(hour,minute)>②“子标记列表”中若干个标记可以尾加模式限定符号来限定该子标记是否允许重复出现、出现的次数。+:尾加该限定符号的子标记必须出现一次或多次*:尾加该限定符号的子标记必须出现0次或多次?:尾加该限定符号的子标记必须出现0次或一次没有尾加任何限定符号的子标记则必须且只能使用一次模式限定符号例子<!EMEMENT客户(编号+,姓名)><!EMEMENT客户名单(客户)><!EMEMENT用户(编号,客户地址?,姓名?)><!EMEMENT用户(编号+,客户地址?,姓名)><!EMEMENT用户(编号,(客户地址,订单)*)>可以使用()来设置组,括号可以嵌套③“子标记列表”的分项也可以是几个标记的“或运算”,而且“或运算”必须用左、右小括号括起。例如:<!ELEMENT应聘者(姓名,(专科|本科|研究生),(男|女))>

解释:约束名为“应聘者”的标记必须依次包含3个子标记:一个名字是“姓名”的子标记,一个名字是“专科”或“本科”或“研究生”子标记(不能同时有),一个名字是“男”或“女”的子标记(不能同时有)。<!ELEMENT应聘者(姓名,(奖励|处分)*,(男|女))>解释:约束标记“应聘者”依次包含若干个子标记:一个名字是“姓名”的标记。多个(包括零个)名字是“奖励”或“处分”的子标记(可以同时有),最后一个名字是“男”或“女”子标记(不能同时有)P37例3-5例<!ELEMENT客户地址(地址,(|Email)?)>约束标记“客户地址”依次包含若干个子标记:一个名字是“地址”的标记。可以有也可以没有“”和“Email”元素(由?指定),但有的话只能是“”或“Email”元素中的一个,不能同时有(由|来指定)2.只包含有文本数据的约束

如果准备约束一个标记没有子标记,也就是说只能有文本数据,那么“标记的约束条件”是用小括号括起的#PCDATA,格式如下:<!ELEMENT标记名称(#PCDATA)><!ELEMENTHello(#PCDATA)><Hello>

你好

<speak>byebye</speak></Hello>×3.包含混合内容的约束如果允许标记的内容既可以有可显示的文本数据,也可以有子标记,那么在DTD文件中,元素的“标记的约束条件”是关键字“#PCDATA”和若干个子标记的“或运算”,而且该“或运算”必须用小括号括起并尾加一个“*”号,格式如下:

<!ELEMENT标记名称(#PCDATA|子标记1|子标记2…|子标记m)*>

例题3.包含混合内容的约束混合内容既可以为空,也可能只包含子元素,也可能是字符数据(#PCDATA),或者是既有字符数据又有子元素的混合形式。注意:混合内容只能约束可以有哪些子标记,不能约束这些子标记出现的次数和出现的顺序,另外,约束条件中也不能使用限制符号4.EMPTY和ANY如果准备约束一个标记是空标记,或者是只含有空字符的非空标记,元素的“标记的约束条件”可以是关键字“EMPTY”;如果不准备对一个元素标记的内容有任何约束,元素的“标记的约束条件”可以是关键字“ANY”。例如:

<!ELEMENTspeakEMPTY><!ELEMENThelloANY>4.EMPTY和ANYANY、EMPTY的前后不能加括号。例中,“客户名单”元素定义为“ANY”,似乎可在“客户名单”中放入任何内容,包括子元素在内,但实际本例错了,因为有效的XML文档中任何元素必须在DTD中给出定义。因此,尽可能不要使用ANY来定义元素内容。3.3.3DTD的完整性

(1)不允许相互嵌套如果一个DTD元素约束某个标记可以出现某个子标记,那么对该子标记进行约束的DTD元素就不能约束该标记的子标记是它的父标记。<!ELEMENT商品名称(name,price)><!ELEMENTprice(商品名称,unit)>×(2)XML文件中的每个标记都必须在DTD中有相应元素进行约束。<!ELEMENT列车时刻表(T28次,T29次)><!ELEMENTT28次(minute,hour)><!ELEMENTT29次(minute,hour)>×3.4DTD对属性的声明

3.4.1属性声明的语法

XML文档中的元素的属性目的是为元素标记提供额外的信息,有些是必要的,有些则不一定需要设置属性,并且有些属性当没有设置属性值时会自动以默认值取代。当然,元素不一定要属性;但若使用了属性,则每个属性都需在DTD中予以定义。DTD中定义元素属性的基本格式:

3.4.1属性声明的语法<!ATTLIST元素名属性名属性类型默认值情况>或<!ATTLIST元素名属性名属性类型默认值情况属性名属性类型默认值情况

…….>

ATTLIST是一个属性列表,可包含多个属性。

例子:<!ATTLIST长方形

widthCDATA“0”heightCDATA“0”lengthCDATA“0”><!ATTLIST姓名性别CDATA“男”>说明:在ATTLIST声明中,涉及到“属性名称”“属性类型”和“默认值情况”,其意义分别阐述如下:(1)属性名称属性名称的命名规则和标记的命名规则相同,可以由字母、数字、下划线(“_”)、点(“.”)或连字符(“-”)组成,但必须以字母或下划线开头。(2)属性类型我们已经知道属性值一定是一个字符串,那么属性类型就决定了属性可以用怎样的字符串作为属性的值。(3)默认值情况

ATTLIST声明是为了约束XML文件中标记的属性,ATTLIST声明中关于属性的“默认值情况”是对XML文件中标记的属性进行约束的细节条件.

3.4.2属性默认值情况1.“默认值情况”是字符串如果某个属性的“默认值情况”是一个字符串,XML中对应元素标记必须有该属性,但元素标记中可人为添加或不添加该属性,若不添加的话则默认有该属性且其属性值即为此处定义的默认值。例:<!ATTLIST张山heightCDATA"160">例题3-8p43属性类型,该类型表明属性值可以是任意字符串默认值情况3.4.2属性默认值情况2.“默认值情况”是#IMPLIED

在ATTLIST定义的属性约束列表中可以设置属性的“默认值情况”是#IMPLIED。表示该元素的该属性可有可无。例:<!ATTLIST电脑鼠标CDATA#IMPLIED>

此时该属性就没有默认值,而且相应的标记里可以附加或不附加该属性3.4.2属性默认值情况3.“默认值情况”是#REQUIRED

在ATTLIST定义的属性约束列表中可以设置属性的“默认值情况”是#REQUIRED。例:<!ATTLIST电脑CPUCDATA#REQUIRED>

此时该属性没有默认值,相应的元素标记必须要添加该属性并给出属性的值,不能缺省。例题3-9p443.4.2属性默认值情况4.“默认值情况”是#FIXED"默认值"

表明属性具有固定的值,不可改变。在XML文件中元素的该属性可指定也可不指定,若没有的话,则默认有该属性且其属性值即为此处定义的默认值;若有的话则属性的值必须与默认值完全相同,即该属性的属性值是不可修改的。例:<!ATTLIST消防车颜色CDATA#FIXED"红色">例题3-10p453.4.3属性的各种类型

某个属性的类型(Type)规定了哪种类型的数据可以作为该属性的值。XML规范允许为元素的属性指定7种不同的类型:CDATA、枚举类型|、NMTOKEN、NMTOKENS、ID、IDREF、IDREFS

3.4.3属性的各种类型1.CDATA类型对于CDATA(CharacterData)类型的属性,该属性的值可以是任何一个字符串,但是,字符串中不能含有含有左尖括号、右尖括号、与符号、单引号和双引号,如果想使用这些字符,可以使用实体引用。例题3-11p463.4.3属性的各种类型2.枚举类型如果属性的类型是枚举类型,那么该属性只可以是枚举值。枚举类型其格式是将属性可以取的值用符号“|”分隔,枚举类型的定义格式如下:

<!ATTLIST标记名称属性名称(属性值1|属性值2|…|属性值n)默认值情况>各候选属性值不允许出现空格<!ATTLIST姓名性别(男性|女)“男性”>例题3-12p473.4.3属性的各种类型3.NMTOKEN类型如果属性的类型是NMTOKEN类型的属性,则属性值只能包含字母、数字、小数点、连字符、下划线和冒号,不能含有空格字符和#。<!ATTLIST桌子widthNMTOKEN#IMPLIED>对应xml:<桌子width="123cm">写字桌</桌子>例题3-13p48×3.4.3属性的各种类型4.NMTOKENS类型对于NMTOKEN类型的属性,其属性值中不能含有空格。如果需要某个属性的属性值含有空格,而且是被空格分隔开的若干子字符串,那么就可以将属性的类型取为NMTOKENS类型.例题3-14p493.4.3属性的各种类型5.ID类型如果希望某个属性的属性值具有唯一性,即不允许其它ID类型的属性再取这个属性值,那么就可以将属性的类型取为ID类型。注意①ID类型的属性值必须以字母或下划线或汉字开头,属性值中不能出现空格。一个元素只能有一个ID类型的属性。注意②需要特别注意的是ID类型属性的“默认值情况”只能是“#REQUIRED”和“#IMPLIED”例题3-15p493.4.3属性的各种类型6.IDREF类型如果准备通过标记的属性值来建立标记之间的联系,就可以在标记中使用IDREF(IdentifierReference)类型的属性。IDREF类型属性的属性值只能取其他元素中ID类型属性的属性值。IDREF属性类型的属性值中不能有空格。例题3-16p503.4.3属性的各种类型7.IDREFS类型我们希望约束某个属性的属性值是若干个其它ID属性的属性值的组合,IDREFDS类型属性的属性值能满足这一愿望。对于IDREFS类型的属性,它的值可以是用空格分隔的若干个其它ID属性的属性值。例题3-17p52参见书上和3.5实体的声明与引用

3.5.1实体的概念与分类1.实体的概念实体在XML中充当宏或别名的角色,其最根本的作用是帮助你为一大段文本创建一个别名,这样,在文件的另一个位置需要引用这段文本时,仅需要指向它的别名就可以了。这样一来,用于重新输入这段文本的大量时间就被节约下来了。它还意味着一旦需要修改,仅需在一个地方做改动,就完成了全局的改动。2.实体的分类

一般实体:用来替代文档具体内容的实体。参数实体:只能在外部DTD中定义和引用的实体,不能在XML文档中引用。内部实体:不是在外部独立的文档中定义实体内容。外部实体:所定义的实体内容为外部独立存在的文件。可解析实体:包含字符、数字、文本块或标记的实体。不可解析实体:包含图片、声音等其他二进制数据的实体。3.5.2内部一般实体

内部一般实体是指在DTD中定义的一段具体文字内容,通常在XML文档的元素中引用,也可在DTD语句中引用。在DTD中声明内部一般实体的语法:<!ENTITY实体名"实体值">说明:<!ENTITY:表示开始声明一个实体,关键字ENTITY必须大写。实体名:必须以字母或下划线(_)开头,后面是0个或多个字母、数字、句点(.)、连字符(-)或下划线(_)。实体名同样也是区分大小写的。实体值:表示实体的具体内容,是一个字符串,对于特殊字符要用实体引用。在XML文

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论