您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > XML基础教程第3章
XML基础教程课件请配合例子代码一起使用第3章有效的XML文件规范性仅仅是XML语言的基本语法,没有对XML文件怎样组织数据进行具体的限制,对同一问题编写的XML文件,在数据组织结构上就可能有很大的不同。3.1有效的XML文件对XML的数据结构进行限制有两种方式:使用文档类型定义(DocumentTypeDefinition,DTD)和XMLSchema模式。DTD的使用要早与XMLSchema模式,DTD和XMLSchema模式各有所长,但XMLSchema模式比DTD更为复杂。一个规范的XML文件如果和某个DTD文件相关联,并遵守该DTD文件规定的限制条件,就称为有效的XML文件。DTD文件的编码必须和其关联的XML文件一致,也就是说,如果XML文件的编码为UTF-8,那么XML关联的DTD文件也必须按着UTF-8编码保存。SYSTEM关联SYSTEM关联型的文档类型声明格式:DOCTYPE根标记的名称SYSTEMDTD文件的URI例如:!DOCTYPEemployeeSYSTEMa0.dtdSYSTEM关联表明所关联的DTD文件由个或工作小组所定义且认可PUBLIC关联PUBLIC关联型的文档类型声明格式:DOCTYPE根标记的名称PUBLIC正式公用标识符DTD文件的URI例如:!DOCTYPEemployeePUBLIC-//ISO123456/Daxian/ForXML/ENa0.dtdPUBLIC关联表明所关联的DTD文件已经得到某一领域的认可,是经过许多人讨论得到认可的DTD文件。dtdFile.dtd!ELEMENT列车时刻表(T28次,T226次)!ELEMENTT28次(开车时间,终到时间)!ELEMENTT226次(开车时间,终到时间)!ELEMENT开车时间(hour,minute)!ELEMENT终到时间(hour,minute)!ELEMENThour(#PCDATA)!ELEMENTminute(#PCDATA)Cha3_1.xml?xmlversion=1.0encoding=UTF-8?!DOCTYPE列车时刻表PUBLIC-//ISO88/China/xml/CHdtdFile.dtd列车时刻表T28次开车时间hour23点/hourminute12分/minute/开车时间终到时间hour23点/hourminute12分/minute/终到时间/T28次T226次开车时间hour08点/hourminute45分/minute/开车时间终到时间hour19点/hourminute36分/minute/终到时间/T226次/列车时刻表3.2怎样检查有效性浏览器的XML解析器只检查XML文件是否是规范的。当用浏览器打开当打开一个有效的XML文件时,浏览器的XML解析器仅仅检查XML文件所关联的DTD文件是否有语法错误,并不检查XML文件是否遵守该DTD规定的约束条件.我们可以使用DOM解析器来检查一个XML文件是否是有效的,有关DOM解析器将在第6章详细讲述。3.3DTD中的元素DTD中的元素(ELEMENT)是用来约束XML文件中的标记,在DTD中使用元素声明来定义一个元素,元素的声明格式为:!ELEMENT标记名称标记的约束条件例如:!ELEMENT列车时刻表(T28次,T29次)约束标记“列车时刻表”只可以有且必须有两个子标记“T28次”和“T29次”。1.规定标记的子标记如果想约束XML文件中某个标记可以有怎样的子标记,比如,标记必须有哪些子标记,子标记是否允许重复出现、出现的顺序如何等,那么DTD中元素声明的“标记的约束条件”是用小括号括起的子标记列表,格式为!ELEMENT标记名称(子标记列表)例如:!ELEMENT开车时间(hour,minute)要求标记“开车时间”恰好有两个子标记“hour”和“minute”,不可以有能显示的文本数据,并且子标记在父标记“开车时间”中出现的顺序必须是“hour”、“minute”而不是“minute”、“hour”.2.限制标记只有文本数据如果准备约束一个标记没有子标记,也就是说只能有文本数据,那么“标记的约束条件”是用小括号括起的#PCDATA,格式如下:!ELEMENT标记名称(#PCDATA)不可以将“开车时间”标记写成(含有可显示的文本“特快列车”):开车时间特快列车hour04点/hourminute58分/minute/开车时间3.规定标记的混合内容一个标记的内容可以有两部分构成:文本数据和标记,其中的标记称做该标记的子标记。上面我们已经知道怎样使用DTD约束标记的子标记,比如,!ELEMENT开车时间(hour,minute)约束“开车时间”只能有子标记,不能含有可显示的文本数据。如果允许标记的内容即可以有可显示的文本数据,也可以有子标记,那么在DTD文件中,元素的“标记的约束条件”是关键字“#PCDATA”和若干个子标记的“或运算”,而且该“或运算”必须用小括号括起并尾加一个“*”号,格式如下:!ELEMENT标记名称(#PCDATA|子标记1|子标记2…|子标记m)*4.EMPTY和ANY如果准备约束一个标记是空标记,或者是只含有空字符的非空标记,元素的“标记的约束条件”可以是关键字“EMPTY”;如果不准备对一个标记有任何约束,元素的“标记的约束条件”可以是关键字“ANY”。例如:!ELEMENTspeakEMPTY!ELEMENThelloANY3.4DTD的完整性(1)不允许无穷嵌套如果一个DTD元素约束某个标记可以出现某个子标记,那么对该子标记进行约束的DTD元素就不能约束该标记的子标记是它的父标记。(2)XML文件中的每个标记都必须在DTD中有相应元素进行约束。3.5DTD中的属性1.ATTLIST声明DTD中的属性列表(ATTLIST)可用来约束XML文件中标记的属性,在DTD中属性列表的声明格式为:!ATTLIST标记名称属性名称属性类型默认值情况属性名称属性类型默认值情况…….属性名称”、“属性类型”和“默认值情况”在ATTLIST声明中,涉及到“属性名称”“属性类型”和“默认值情况”,其意义分别阐述如下:(1)属性名称属性名称的命名规则和标记的命名规则相同,可以由字母、数字、下划线(“_”)、点(“.”)或连字符(“-”)组成,但必须以字母或下划线开头。(2)属性类型我们已经知道属性值一定是一个字符串,那么属性类型就决定了属性可以用怎样的字符串作为属性的值。(3)默认值情况ATTLIST声明是为了约束XML文件中标记的属性,ATTLIST声明中关于属性的“默认值情况”是对XML文件中标记的属性进行约束的细节条件2.属性的默认值!ATTLIST声明中包括“属性名称”、“属性类型”和“默认值情况”,其中的“默认值情况”含有约束的细节条件。“默认值情况”可以是字符串、关键字:“#IMPLIED”、“#REQUIRED”或关键字:“#FIXED”和一个字符串。“默认值情况”对标记中的属性的约束意义的表述。以下就“默认值情况”的几种情况详细讨论如下(1)字符串如果某个属性的“默认值情况”是一个字符串,XML中对应标记必须有该属性,但标记可以不明显地添加该属性。!ATTLIST张山heightCDATA160(2)#IMPLIED在!ATTLIST属性声明里可以设置属性的“默认值情况”是“#IMPLIED”。例如:!ATTLIST顾客height#IMPLIED当属性的“默认值情况”是关键字“#IMPLIED”时,该属性就没有默认值,而且相应的标记里可以不使用该属性。(3)#REQUIRED在!ATTLIST属性声明里可以设置属性的“默认值情况”是“#REQUIRED”,例如:!ATTLIST顾客height#REQUIRED当属性的“默认值情况”是关键字“#REQUIRED”时,该属性没有默认值,相应的标记必须要添加该属性并给出属性的值。(4)#FIXED在!ATTLIST属性声明里可以设置属性的“默认值情况”是关键字“#FIXED”和一个字符串。例如:!ATTLIST消防车颜色CDATA#FIXED红色当属性的“默认值情况”是关键字“#FIXED”和一个字符串时,该属性的默认值就是关键字“#FIXED”后面指定的那个字符串。对应的标记可以不添加该属性,但如果添加该属性,那么不可以改变属性的值,即该属性的值必须是关键字“#FIXED”指定的字符串。3.属性类型属性类型决定了属性可以用怎样的字符串作为属性的值。属性的常用类型有:CDATA、Enumerated、NMTOKEN、NMTOKENS、ID、IDREF、IDREFS。以下分别来介绍这些属性类型。(1)CDATA类型对于CDATA(CharacterData)类型的属性,该属性的值可以是任何一个字符串,但是,字符串中不能含有含有左尖括号、右尖括号、与符号、单引号和双引号,如果想使用这些字符,可以使用字符引用实体引用。(2)Enumerated类型如果属性的类型是Enumerated类型,那么该属性只可以取枚举出的值。Enumerated不是关键字,是指类型定义的格式,其格式是将属性可以取的值用符号“|”分隔,Enumerated类型的定义格式如下:!ATTLIST标记名称属性名称(属性值1|属性值2|…|属性值n)默认值情况(3)NMTOKEN类型如果属性的类型是NMTOKEN类型的属性,属性值可以由字母、数字、下划线(“_”)、点(“.”)或连字符(“-”)组成,属性值中不能含有空格字符(属性值也可以用数字、点或连字符开头)。(4)NMTOKENS类型我们已经知道,对于NMTOKEN类型的属性,其属性值中不能含有空白类字符。如果需要某个属性的属性值含有空白类字符,而且被空白分隔开的子字符串符合NMTOKEN类型属性的属性值之规定,那么就可以将属性的类型取为NMTOKENS类型。3.6DTD中的实体W3C允许我们在DTD文件中定义实体,然后与该DTD文件关联的XML文件可以通过实体引用使用该实体。实体分为普通实体和参数实体,普通实体简称为实体。实体在DTD文件中定义,和该DTD关联的XML文件通过实体引用来使用实体,解析器在解析标记的数据时,将用实体的内容替换实体引用。参数实体在DTD文件中定义,只能由DTD文件本身通过实体引用使用参数实体,参数实体和关联的XML无关。1.实体(1)内部实体的声名!ENTITY实体的引用“实体的内容”例如:!ENTITYhello“Howareyou,&你好”XML文件可以用“&实体的引用;”引用该实体。比如:&hello;解析器解析数据时,首先将“&hello;”替换为“Howareyou,&你好”,最后解析出的数据是:“Howareyou,&你好”。(2)外部实体的声名外部实体是指实体的内容是DTD文件以外的其它文件。例如:!ENTITYjavaSYSTEMA.javaXML文件可以用“&实体的引用;”引用该外部实体。比如:&java;解析器解析标记中的数据时,将“&java;”替换为文件“A.java”的内容。3.8DTD中的参数实体参数实体可以减少DTD文件维护带来的工作量,例如,我们事先声名了参数实体及其引用:!ENTITY%node(性别,年龄)那么,只要将node引用的实体“(性别,年龄)”修改为“(sex,age,borth)”即可。在DTD中,参数实体的声明格式是:!ENTITY%参数实体的引用参数实体的内容3.9内部DTD我们也可以把DTD文件的内容直接写在XML文件的内部,相对外部DTD文件,这样的内容称做XML文件的内部DTD在XM
本文标题:XML基础教程第3章
链接地址:https://www.777doc.com/doc-3528499 .html