版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1页第3章有效的XML文件—DTD引言本章学习目标本章大纲引言文档类型定义(DocumentTypeDefinition,DTD)是有效的XML文档的基础。用户可按照XML文档语法规则随意地创建自己的标记,向其中添加元素和属性等,但是如果每个人或每家公司都按照自己的意愿和爱好设计标记、添加元素及属性,那么对于同一问题设计出来的文档之间就可能有很大的不同,不便于解析器解析其中的数据,因此需要一套机制通过设置特定的规则来控制XML文档结构。这套机制就称为文档类型定义,简称为DTD。本章大纲3.1DTD概述3.2DTD的基本结构3.3DTD元素定义3.4DTD属性说明3.5DTD实体声明3.6DTD现状和Schema的优势本章学习目标● 理解DTD的基本概念● 掌握DTD元素类型及声明语法● 掌握DTD属性类型及声明语法● 理解DTD实体类型及声明语法● 了解DTD文件现状DTD概述-1DTD(DocumentTypeDefinition)是一套关于标记符的语法规则。它是XML1.0版规格的一部分,是XML文件的验证机制,属于XML文件组成的一部分。DTD文件是一个ASCII文本文件,后缀名为.dtd。DTD概述-2DTD提供了一套检验数据的语言,在DTD中详细描述了每个元素可以包含的子元素、元素的出现顺序、出现次数以及属性的相关设置等信息。可以确保文档内部数据的正确性。文档类型定义的作用就是给予文档一种格式(type),使用户知道所使用的XML文档需包含哪些标记(tag)、属性(attribute)、实体(entities)。DTD定义了置标语言、文档结构的语法和词汇表,实际上是定义了一个语法分析器。DTD的分类外部DTD可以单独形成文件,后缀名为.dtd,该文件可以被多个XML文档共享和DTD调用。内部DTD是在XML文档中直接定义DTD,该DTD只能被当前XML文档使用。DTD的基本结构-1
内部DTD文档类型声明以“<!DOCTYPE”开始,以“]>”结束,通常将开始和结束标记放在不同的行。<!DOCTYPE根元素名称[<!ELEMENT子元素名称(#PCDATA)>]>内部DTD举例【例3-1】带有内部DTD的XML文档<?xmlversion=”1.0”encoding=”GB2312”><!DOCTYPEbook[<!ELEMENTbook(name)><!ELEMENTname(#PCDATA)>]><book><name>《XML教程》</name></book>DTD的基本结构-2外部DTD如果需要在XML文件中使用外部DTD,必须在XML文档的文档类型定义部分通过URL引用外部DTD,语法格式声明如下:<!DOCTYPE
根元素名称
SYSTEM"DTD-URL">或<!DOCTYPE根元素名称PUBLIC“DTD-name”“DTD-URL”>外部DTD举例-1【3-2】外部引用DTD先根据需求构思XML文档的格式,建立DTD文档。<?xmlversion=”1.0”encoding=”GB2312”><!ELEMENTbook(name,publisher,company,author)><!ELEMENTname(#PCDATA)><!ELEMENTpublisher(#PCDATA)><!ELEMENTcompany(#PCDATA)><!ELEMENTauthor(#PCDATA)>将上述代码保存到book.dtd文档外部DTD举例-2引用上述DTD文档的XML文档内容如下:<?xmlversion=”1.0”encoding=”GB2312”><!DOCTYPE
bookSYSTEM“book.dtd”><book><name>《XML教程》</name><publisher>清华大学出版社</publisher><company>郑州大学</company><author>慕橙</author></book>DTD基本结构模板DTD的基本结构包括XML声明、元素声明、属性声明、实体声明等,DTD基本结构模板如下所示:<!ELEMENT…> <!--定义一个XML元素--><!ELEMENT…>…<!ATTLIST…> <!--指定元素拥有的属性--><!ATTLIST…>…<!ENTITY…> <!--定义一个实体-->…<!NOTATION…> <!--定义一个符号-->...DTD元素定义元素是DTD的重要组成部分。在DTD中,元素是通过ELEMENT标记声明的,该标记提供所有声明元素的名称和内容规范。元素的名称遵守XML对名称的限制。<!ELEMENT元素名称类别>或者<!ELEMENT元素名称(元素内容)>表示XML的标记名指明XML中此元素应该包含什么类型的数据指明XML中此元素应该包含什么样的内容对子元素的规定如果一个元素有一个或多个子元素,需要将子元素定义在括号中。在DTD中,通过正则表达式规定子元素出现的顺序和次数。语法分析器将这些正则表达式与XML文档内部的数据模式相匹配,以判别一个文档是否是ValidatingXML。符号说明符号说明+必须出现一次以上?不出现或只出现一次*不出现或可出现多次无符号只出现一次子元素声明举例【例3-3】声明子元素Authorlist元素拥有子元素author,且可能有一个或多个:<!ELEMENTauthorlist(author+)>遵循上述DTD规定的XML文件应该这样定义:<authorlist><author>李四</author><author>张三</author></authorlist>空元素空元素表示在XML的标记中没有任何数据,不能包含子元素和文本,但可以有属性。语法格式如下:<!ELEMENT元素名EMPTY>【例3-4】声明空元素<!ElEMENTbrEMPTY>在XML中,下面的元素就是合法的。<br/>Unrestricted元素Unrestricted元素表示在XML文档中可以包含任何在DTD中定义的元素内容。一般情况下,只把文档的根元素定义为此类型,这样设定后,元素出现的次数和顺序不受限制。语法格式如下:<!ELEMENT元素名称ANY>【例3-5】声明Unrestricted元素<!ElEMENTanimalsANY>注意:过多地使用ANY会破坏文档结构的清晰性,所以在DTD中应慎用ANY。简单元素简单元素使用关键字#PCDATA,此元素可以包含任何字符数据,但不能包含子元素。语法格式如下:<!ELEMENT
元素名称
(#PCDATA)>【例3-6】声明简单元素<!ELEMENTbookname(#PCDATA)>上述bookname可以是空元素也可以包含数据内容,但是一定不能包含子元素。如果在XML文档中定义子元素,则是非法的,例如:<bookname><author>张三</author><name>XML教程</name></bookname>以上代码会被验证出错。混合元素混合元素类型的定义为:<!ELEMENT元素名(#PCDATA|子元素1|子元素2|···|子元素n)*>【例3-7】声明混合元素<!ELEMENTbook(#PCDATA|author|press)*>相应XML文档如下所示:<?xmlversion=”1.0”encoding=”GB2312”><!DOCTYPEbook[<!ELEMENTbook(#PCDATA|bookname|author|press)*><!ELEMENTbookname(#PCDATA)><!ELEMENTauthor(#PCDATA)><!ELEMENTpress(#PCDATA)>]><book><bookname>XML教程</bookname></book>DTD属性说明属性描述元素的额外信息,是对元素的修饰与补充。信息详细的XML文档都有一个特点,即元素通过属性来添加附加信息。元素的属性声明由ATTLIST关键字、元素名称及属性定义3部分构成。<!ATTLIST元素名属性名属性类型属性限定条件>一个声明可以同时声明元素的多个属性,只需要使用空格分隔即可。属性的默认值名称含义#REQUIRED必须赋值的属性,在XML文档中必须给出这个属性的属性值#IMPLIED属性值可有可无的属性,不要求在XML文档中给该属性赋值,而且也无需在DTD中为该属性提供默认值#FIXED固定取值的属性。需要为一个特定的属性提供一个特定的默认值,并且不希望XML文档中另给出元素值把此默认值代替掉Defaultvalue事先定义了默认值的属性。需要在DTD中提供一个默认值,在XML文档中可以为该属性提供新的属性值,也可以不另外给出属性值属性的类型类型含义CDATA纯文本,由可显示字符组成的字符串Enumerated取值来自一组可接受的取值范围,在()内被指定ID以属性值的方式为文档中的某个元素定义唯一的标识,用以区分具有相同结构、相同属性的不同元素IDREF属性值引用已定义的ID值,方法是把那个元素的Tn标识值作为该属性的取值ENTITY取值为一个已定义的实体ENTITYS该属性包含多个外部实体,不同实体用空格隔开NMTOKEN表述属性值只能由字母、数字、下划线、句点(.)、冒号(:)、连字符(一)这些符号组成NMTOKENS表示属性值可以由多个NMTOKEN组成,每个NMTOKEN之间用空格隔开CDATA类型一个CDATA类型的属性可以包含除小于号“<”、大于号“>”,与符号“&”、双引号“””和单引号“’”的任何字符,前提条件是它必须满足规范格式的约束。【例3-11】在DTD中定义CDATA类型的属性<!ATTLISTbooksalesCDATA#REQURED>此定义说明book元素有一个sales是必需赋值的属性,该属性值是任何字符数据,在本例中可用此属性描述该图书是否售出的状态。如果需要使用小于号“<”、大于号“>”,与符号“&”、双引号“””和单引号“’”这几个特殊字符,就使用实体引用(<;,>;,&;,";和&apos;)替代特殊字符。ID类型ID属性值是具有唯一性的值,如身份证号码、学生学号都属于此类。如果在整份XML文件中需要类似数据表的主索引,就可以将属性设为ID属性类型。如果XML文档在元素属性的声明中定义了ID属性,则这个元素必须在文档中拥有一个唯一的标识符,只有这样的文档才能通过DTD的检验。【例3-13】在DTD中定义ID类型的属性<!ATTLISTstudentsidID#REQUIRED>上述的属性声明指出student元素的sid属性为ID类型,该属性的值可以唯一的标识“sid”Enumerated类型Enumerated类型即是枚举类型,枚举声明了属性的备选值列表,属性必须从该列表中选择一个值作为属性值。通过竖线“|”把备选值隔开。【例3-14】在DTD中定义枚举类型的属性<!ATTLIST学生答题(正确|错误)“正确”>本例中包含一个枚举类型的属性声明,元素学生的属性“答题”的属性值可以取值“正确”或“错误”,而且默认取值为“正确”。IDREF和IDREFSIDREF类型是ID类型的引用类型,IDREFS类型是多个ID类型的引用。IDREF和IDREFS类型的属性值必须指向带有ID属性的元素。对于IDREF类型的属性,其属性值必须和文档中某些ID属性相匹配。如果IDREF类型的属性值是一个不存在的ID值时,该XML文档会被验证无效。【例3-15】在DTD中定义IDREF类型的属性<?Xmlversion=”1.0”encoding=“GB2312”?><!ELEMENTBookOrder(Customer+,book+)><!ELEMENTCustomer(name*)><!ELEMENTname(#PCDATA)><!ELEMENTbook(publishing+)><!ELEMENTpublishing(#PCDATA)><!ATTLISTCustomeroidIDREF#REQUIRED><!ATTLISTbookbidID#REQUIRED>IDREF和IDREFS(续)<?xmlversion=”1.0”encoding=”GB2312”><!DOCTYPEBookOrderSYSTEM“book.dtd”><BookOrder><Customeroid=”ISBN7-333-33333-3”><name>Tom</name></Customer><Customeroid=”ISBN7-333-33333-2”><name>Lucy</name></Customer><bookbid=”ISBN7-333-33333-3”><publishing>清华大学出版社</publishing></book><bookbid=”ISBN7-333-33333-2”><publishing>北京大学出版社</publishing></book></BookOrder>NMTOKEN和NMTOKENSNMTOKEN类型类似CDATA属性类型,但NMTOKEN是一个比CDATA类型更宽松的类型,它只要求该属性的属性值是一个合法的XML表示即可。也就是说,NMTOKEN类型的属性值也是字符串数据,但NMTOKEN类型的属性值中允许出现的字符要多。NMTOKEN类型的属性值中不能包含空格字符,可以由字母、数字、下划线、点号“.”或连字符“_”组成,可以使用数字、点号或连字符开头。【例3-16】在DTD中定义NMTOKEN类型的属性<?xmlversion=”1.0”encoding=“GB2312”?><!ELEMENT书籍列表(计算机书籍*)><!ELEMENT计算机书籍(书名,作者,价格,简要介绍)><!ELEMENT书名(#PCDATA)><!ELEMENT作者(#PCDATA)><!ELEMENT价格(#PCDATA)><!ELEMENT简要介绍(#PCDATA)><!ATTLIST作者地址NMTOKEN#REQUIRED>NMTOKEN和NMTOKENS(续)<?xmlversion=”1.0”encoding=”GB2312”><!DOCTYPE书籍列表SYSTEM“book.dtd”><书籍列表><计算机书籍><书名>XML教程</书名><作者地址=”郑州”>李刚</作者><价格>63</价格><简要介绍>该书主要介绍了XML的各种相关知识。</简要介绍></计算机书籍></书籍列表>ENTITY和ENTITIESENTITY类型的属性包含在DTD的其他位置声明的未解析实体中,它能够把外部二进制数据,即外部未解析的普通实体链接到XML文档。ENTITY类型的属性值是在DTD中声明的未解析常规实体的名称,它与外部数据相连。【例3-17】在DTD中定义ENTITY类型的属性<?Xmlversion=”1.0”encoding=”gb2312”><!DOCTYPEphotos[<!ELEMENTphotos(photo*)><!ELEMENTphotoEMPTY><!ATTLISTphotosourceENTITY#REQUIRED><!ENTITYsrcSYSTEM“img.gif”>]><photos><photosource=”src”/></photos>DTD实体声明在XML文档中,可以将经常使用的XML文本区段定义成实体,这样可以快速地将XML文本内容插入到任何需要插入的地方。此外,也可以将外部文件定义成实体,然后将外部数据附加到XML文档。实体的概念在XML中,实体一词具有广泛的含义,其基本意思是指与XML文档相关的下列任何形式的存储单元。有效的XML文档本身。外部的DTD子集。定义成DTD中外部实体的外部文档。在DTD中定义的,用引号括起来的字符。实体的分类实体可以通过3种方式进行分类。(1)通用实体与参数实体通用实体可以在XML文档中使用。参数实体只能用在DTD文件中,该实体包含了可以被安插在DTD中的XML文档。(2)内部实体和外部实体内部实体是实体的内容已经包含在DTD文件中。外部实体的内容是通过URI引用DTD以外的其他文件。(3)可解析实体与不可解析实体可解析实体就是可以被解析器解析的数据。不可解析实体就是解析器无法解析的数据,通常指二进制数据。XML文档中不可引用不可解析实体。内部通用实体-1内部通用实体是在文档实体内部定义和使用的实体,其内容通常是一段文本字符。这种实体要在DTD中通过DTD语句的定义,可以在XML文档中使用,也可以在DTD中使用。其定义的语法格式如下:<!ENTITYentity_name“entity_value”>其中,<!ENTITY>为关键字,entity_name为实体名称,entity_value为实体所代替的文本内容。引用内部通用实体以“&”开始,以“;”结束。例:&entity_name;内部通用实体-2当内部通用实体在DTD中引用时,需注意以下两方面:(1)不能在元素及属性的声明中引用内部通用实体,如下面的语句是非法的:<!ENTITYpcd(#PCDATA)><!ELEMENTtitle&pcd>(2)在语句中不能出现循环,如下面的语句是非法的。<!ENTITYthepub“北大&pub;”><!ELEMENTpub“出版社&thepub:”>外部通用实体外部通用实体为独立的文件,可被多个文档所引用。正因为每一个完整的XML文档都是一个合法的实体,所以XML通过对外部通用实体的引用,可以在一个XML文档中嵌入另一个XML文档,或者将多个文档组合成一个文档。其定义的语法格式如下:<!ENTITYentity_name“URL”>其中,URL为引用的外部实体的URL地址。引用外部通用实体也与引用内部通用实体的方法一样:&entity_name;参数实体与通用实体的区别(1)在引用形式上,通用实体的引用为“&entity_name;”,而参数实体的引用则为“%entity_name;”(2)在引用范围上,通用实体可在XML文档中引用,也可在DTD中引用,而参数实体只可在DTD中引用。内部参数实体内部参数实体是指在独立的内部DTD文档的内部定义和使用的实体,其内容仅能为DTD而非XML文档内容的书写文本。定义内部参数实体的语法格式如下:<!ENTITY%entity_name“entity_value”>【例3-21】内部参数实体的定义及引用<!ENTITY%HeadingAlign“left|center|right”><!ELEMENTmessage(Content,Align)+><!ELEMENTContent(#PCDATA)><!ELEMENTAlign(%HeadingAlign;)>外部参数实体外部参数实体是指在独立的外部DTD文档的外部定义和使用的实体,外部参数实体用于将多个独立的DTD文档组合成一个大的DTD文档。定义外部参数实体的语法格式如下:<!ENTITY%entity_name“URL”>DTD现状DTD是验证XML文档有效性的方法之一,其存在着一些不足。作为SGMLDTD的一个子集,XMLDTD与XML的格式完全不同。因此,XML文档开发人员必须使用这套与XML本身不同的语法来验证X
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论