高级高级WbWb技术技术高级高级WebWeb技术技术WebWeb上的数据标准上的数据标准XMLXMLWebWeb上的数据标准上的数据标准XMLXML——DTDDTD本次课程内容本次课程内容DTDDTDDTD简介文档类型声明文档类型声明DTD声明-ELEMENTDTD声明-ATTLISTDTD声明-ATTLISTDTD简介DTD简介文档类型定义(DocumentTypeDefinition,DTD)起源于文档类定义(yp,)起源于SGML中更复杂的DTD,是一组能融合在XML数据中或者以单独的文档存在的声明,用于对XML文档进行描述和校验,以保证XML文档的有效性保证XML文档的有效性验证与有效性验证与有效性验证:确认XML数据遵循特定的预定的结构从而使应用程序可以以可预知的方式来接收数据验证方法主要包括文档类型定义(DTDfiii验证方法主要包括文档类型定义(DocumentTypeDefinition,DTD)和XML模式有效性检查将一个特定的文档与一个DTD进行比较验证。用这种方法对或模式检查过的文档被为是有效的文档对照DTD或模式检查过的文档被认为是“有效的(valid)”文档。良构性(Well-form)是有效的前提DTD简介DTD简介RichardTobin的基于RXP的以Web为宿主的XMLRichardTobin的基于RXP的以Web为宿主的XML结构完整性和合法性检查程序DTD简介DTD简介DTD使用非XML语法的文法来定义一些规则,这些规则描述使用非语法的文法来定义规则,规则描了XML的结构和语法,以及被允许出现的XML数据内容DTD优点可以促使不同的应用程序可以读取相互的文件,实现共享每个XML文档都可携带对其本身格式的说明独立享.每一个XML文档都可携带对其本身格式的说明;独立的人员小组可统一使用共同的DTD来交换数据;应用程序可使用一种标准的DTD来核实将要处理的数据应用程序可使用种标准的DTD来核实将要处理的数据是否有效。DTD简介DTD简介DTD本身是可选的本身是可的XML文档可以只是一个正规的文档还有其他可以用来保证XML文档有效性的技术:SchemaXML-Data……DTD的内容和特征:对数据结构进行描述和确认将这些数据结构传送给其他应用程序和人员限制元素内容限制属性类型和值提供默认值限制属性类型和值,提供默认值对可置换内容--实体(Entity)进行描述和定义可以有条件节可以有条件节DTD简介DTD简介DTD结构:结构一个文档只能与一个DTD相关联,但是一个DTD可以分成两部分:内部子集和外部子集内部子集被包含于XML文档中外部子集可以存放在以dtd为后缀名的独立文件中当内部子集和外部子集存在声明冲突时内部子集的当内部子集和外部子集存在声明冲突时,内部子集的声明覆盖外部子集的声明外部子集和内部子集的选择:外部子集和内部子集的选择:一般情况尽量使用外部子集,便于修改和复用下面情况下使用内部子集:为了使用已经存在但不能完全满足我们需要的DTD,通过修改和扩充该外部DTD在DTD开发过程中进行测试DTD简介DTD简介一个简例个简例greetingxml:greeting.xml:?xmlversion=1.0?GREETINGHelloXML!/GREETINGgreeting.dtd:!ELEMENTGREETING(#PCDATA)DTD简介DTD简介有效的文档(usegreeting.dtd)有效的文档(usegreeting.dtd)GREETINGvariousrandomtextbutnomarkup/GREETING无效的文档GREETINGsometagrandomtet/sometagGREETINGsometagrandomtext/sometagsomeEmptyTag//GREETING文档类型声明文档类型声明文档类型声明(DocumentTypeDeclaration)将文档类型声明(DocumentTypeDeclaration)将XML文档与DTD关联起来文档类型声明出现在文档的prolog中,在XML声明文档类型声明出现在文档的prolog中,在XML声明之后以及根元素之前文档类型声明包含或者指向一个DTD,但在DTD中不能再包含文档类型声明语法:!DOCTYPEdoc_elem[SYSTEM|PUBLIC][identifier][location][internalsubset]docelemXML文档的根元素doc_elem:XML文档的根元素文档类型声明内部DTD文档类型声明-内部DTDXML声明?xmlversion=“1.0”standalone=“yes”?文挡类型说明DTD声明!DOCTYPEGREETING[!ELEMENTGREETING(#PCDATA)]GREETINGHelloXML!/GREETING文挡类型说明DTD声明GREETINGHelloXML!/GREETINGDTD可以直接包含在使用该DTD的文档内文档类型声明文档类型声明文档类型声明开始于标记!DOCTYPE,结束于标记].记]DTD:!ELEMENTGREETING(#PCDATA)根元素:GREETING根元素:GREETING文档类型声明外部DTD文档类型声明-外部DTD外部DTD独立存在于另一个文件中,从一个或多个外外部DTD独立存在于另个文件中,从个或多个外部URL链接到XML文档中XML的一个重要特点来自于公共DTDs,能在不同的XML文档中共享这些DTDs文档类型声明外部DTD文档类型声明-外部DTD私有DTDs私有DTDs由个人或者工作组使用,而不是公开发布.语法(使用SYSTEM关键字):语法(使用SYSTEM关键字):!DOCTYPEroot_element_nameSYSTEM“DTD_URL”必须在后面的DTD_URL部分指明外部DTD的URL!DOCTYPEToyscoSYSTEMhttp://....!DOCTYPEToyscoSYSTEMfile:///....不能在这个部分的URL中使用字符#不能在这个部分的URL中使用字符#!DOCTYPEToyscoSYSTEMhttp://..../1.dtd#part1文档类型声明外部DTD文档类型声明-外部DTD公用DTDs用于更加广泛的组织,可作为一个工业界标准,如ISO,或者IEEE,可以标准化公用DTDs语法:语法:!DOCTYPEroot_element_namePUBLICFPIURLFPI(Formalpublicidentifier,正式公用标志符)有四个域组成:第一个域指定DTD到一个正式的标准的链接。对于自定义DTD,第个域指定DTD到个正式的标准的链接。对于自定义DTD,这个域应该是短横线“-”;对于一个非标准团体认可的,使用“+”;如果是正式的标准,则使用该标准的应用(如ISO/IEC13449:2000)第个域指定对这个DTD负责维护的机构或者个人的名称第二个域指定对这个DTD负责维护的机构或者个人的名称第三个域指出描述的文档的类型,昀好加上一个惟一的类型标识符号,如昀新的版本号第四个域说明DTD使用的语言(如EN表示英语)第四个域说明DTD使用的语言(如EN表示英语)FPI中的各个域以双斜线“//”分开!DOCTYPEDOCUMENTPUBLIC“-//starpowder//CustomXMLVersion1.0//EN“““DTD声明DTD声明整个DTD可以分为内部子集与外部子集,而每个子集又是由零条到多条基本DTD声明构成的语法:!keywordparam1param2…paramN!keyword中不能有空格基本的四个关键字为:基本的四个关键字为:ELEMENT用于声明元素与子元素ATTLIST用于声明属性与默认值ENTITY用于声明各种实体NOTATION用于描述非XML内容DTD声明ELEMENTDTD声明-ELEMENT语法:!ELEMENTnamecontent_category或者!ELEMENTname(content_model)cardinalityname是被描述的元素名,必须为合法XML名字name是被描述的元素名,必须为合法XML名字后面参数描述了name元素可以包含那些内容和/或子元素元素的内容可以分为下面五种情况:ANY(任意)ANY(任意)任何格式正规的XML数据EMPTY(无)name元素为空元素只允许属性存在name元素为空元素,只允许属性存在纯文本:包含任何文本字符数据,但是不包含任何子元素纯元素:只包含子元素,但是不包含任何文本内容混合既可以包含子元素也可以包含文本内容混合:既可以包含子元素,也可以包含文本内容前两种类型可以使用语法的第一种形式,后三种类型使用第二种语法形式DTD声明ELEMENTDTD声明-ELEMENT没有integer,floatingpoint,date,或者其他数据类没有integer,floatingpoint,date,或者其他数据类型定义元素的声明次序是没有关系的?xmlversion=1.0encoding=UTF-8?!DOCTYPEDOCUMENT[!DOCTYPEDOCUMENT[!ELEMENTfilesEMPTY!ELEMENTDOCUMENT(files)]DOCUMENTfiles/files/DOCUMENTDTD声明ELEMENTDTD声明-ELEMENTANY类型:ANY类型:要谨慎使用,其对于name元素内部内容没有任何规定定Forexample:!ELEMENTcatalogANYDTD声明ELEMENTDTD声明-ELEMENTEMPTY类型:EMPTY类型:定义空元素类型Forexample:大小写敏感Forexample:!ELEMENTBREMPTYInuse:useBR/DTD声明ELEMENTDTD声明-ELEMENT内容模型用于给后三种类型元素指明内容的结构内容模用于给后种类元素指明内容的结构ANY和EMPTY类型不允许使用任何内容模型内容模型基本语法是子元素名列表和/或由圆括号括起的#PCDATA关键字#PCDATA关键字通过()可以将他们组成混合片断可以使用逗号“”来间隔各个片断表示各个片断是顺序出现的可以使用逗号,来间隔各个片断,表示各个片断是顺序出现的可以使用|来间隔各个片断,表示各个片断是选择关系的可以用基数操作符来定义片断在内容模板里出现的次数可以嵌套例子!ELEMENTname(#PCDATA)例子()!ELEMENTname((child1,child2)|(child3,child4))!ELEMENTname(#PCDATA|child1|child2)*DTD声明ELEMENTDTD声明-ELEMENT纯文本类型:(#PCDATA)纯文本类型(#)Forexample:!ELEMENTyear(#PCDATA)valid:year1999/yearyear1999C.E./yearyearTheyearofourLordonethousand,ninehundred,andninety-nine/yearInvalid:yearthJ/thmonthJanuary/monthmonthFebruary/month/ye