




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第第3章章 有效的有效的XML文件文件2第第3章章 有效的有效的XML文件文件3.1有效的有效的XML文件的定义文件的定义3.2如何检查有效性如何检查有效性3.3 DTD中的元素中的元素3.4 DTD的完整性的完整性3.5 DTD中的属性中的属性3.6 DTD中的实体中的实体3.7可解析实体与不可解析实体可解析实体与不可解析实体3.8 DTD中的参数实体中的参数实体3.9内部内部DTD3.10 IGNORE和和INCLUDE3.11 DTD的名称空间的名称空间3第第3章章 有效的有效的XML文件文件 规范性仅仅是规范性仅仅是XML语言的基本语法,没有语言的基本语法,没有对对XML文件怎样组织
2、数据进行具体的限制,文件怎样组织数据进行具体的限制,对同一问题编写的对同一问题编写的XML文件,在数据组织文件,在数据组织结构上就可能有很大的不同。结构上就可能有很大的不同。Time1.xml和和Time2.xml 4列车时刻列车时刻Time1.xml开车时间:开车时间:20点点58分分Time2.xml开车时间:开车时间:20点点58分分5商店营业时间商店营业时间STime1.xml 国贸大厦国贸大厦08:30至至18:30 华联商场华联商场07:30至至22:306商店营业时间商店营业时间STime2.xml国贸大厦国贸大厦08:3018:30 华联商场华联商场07:3022:30 73.
3、1有效的有效的XML文件定义文件定义对对XML数据进行约束的主要原因:数据进行约束的主要原因:n一是使一是使XML的数据组织更加合理,符合系统要求;的数据组织更加合理,符合系统要求;n二是便于维护二是便于维护XML中的数据,从而提高整个系统的可中的数据,从而提高整个系统的可维护性。维护性。针对某些问题,针对某些问题,有时可能需要对有时可能需要对XML文件怎样组织数据,文件怎样组织数据,即数据结构,即数据结构,进行必要的限制,以便解析器能更好解析进行必要的限制,以便解析器能更好解析其中的数据。其中的数据。83.1有效的有效的XML文件文件定义定义对对XML的数据结构进行限制有两种方式:使的数据结
4、构进行限制有两种方式:使用文档类型定义(用文档类型定义(Document Type Definition,DTD)和)和XML Schema模式。模式。但二者最重要的区别是但二者最重要的区别是XML Schema是一个特殊是一个特殊的的XML文件,而文件,而DTD是有独立语法结构的文件。是有独立语法结构的文件。DTD的使用要早与的使用要早与XML Schema模式,模式,DTD和和XML Schema模式各有所长,但模式各有所长,但XML Schema模式比模式比DTD更为复杂。本章主要讨论更为复杂。本章主要讨论DTD,以及怎样使用它约束,以及怎样使用它约束XML文件。文件。一个规范的一个规范
5、的XML文件如果和某个文件如果和某个DTD文件文件相关联,并遵守相关联,并遵守DTD文件规定的限制条件,就文件规定的限制条件,就称为有效的称为有效的XML文件。文件。93.1.1初识初识DTD下面用一个简单例子说明如何使用下面用一个简单例子说明如何使用DTD文件来约束文件来约束XML文件中的数据结构。文件中的数据结构。需要一个刻画商店营业时间的需要一个刻画商店营业时间的XML文件,但数据结构必文件,但数据结构必须符合下列要求:须符合下列要求:n根标记名称为:商店营业时间根标记名称为:商店营业时间n根标记可以有若干个名称为根标记可以有若干个名称为“商店商店”的子标记。的子标记。n名称为名称为“商
6、店商店”的标记顺序地包含的标记顺序地包含 有名称为有名称为“商店名商店名称称”“”“开门时间开门时间”“”“关门时间关门时间”的子标记。的子标记。n名称为名称为“商店名称商店名称”的标记包含的内容只能是文本数据,的标记包含的内容只能是文本数据,不能有子标记。不能有子标记。n名称为名称为“开门时间开门时间”的标记包含的内容只能是文本数据,的标记包含的内容只能是文本数据,不能有子标记。不能有子标记。n名称为名称为“关门时间关门时间”的标记包含的内容只能是文本数据,的标记包含的内容只能是文本数据,不能有子标记。不能有子标记。103.1.1初识初识DTDDTD文件是由元素所构成的文本文件。在文件是由元
7、素所构成的文本文件。在DTD文件中,用关键字文件中,用关键字ELEMENT来定义来定义一个元素,格式如下:一个元素,格式如下:注意:注意:在在DTD文件中,元素的定义用文件中,元素的定义用“”结束。要特别结束。要特别注意的是注意的是 “! ELEMENT”中的中的“、!、!、ELEMENT”间不要有空格。间不要有空格。11limitShop.dtd12商店营业时间商店营业时间STime2.xml国贸大厦国贸大厦08:3018:30 华联商场华联商场07:3022:30 13注意:注意:某些书将某些书将XML文件中的标记也称为元文件中的标记也称为元素,本书为符合素,本书为符合WEB设计中的习惯,
8、设计中的习惯,没有在没有在XML文件使用元素这一术语,文件使用元素这一术语,而使用标记这一术语。而使用标记这一术语。 需要特别提到的是,需要特别提到的是,DTD中的元素和中的元素和XML文件中的标记的语法格式有很大文件中的标记的语法格式有很大不同。不同。143.1.2DTD文件的保存文件的保存nDTD文件由元素构成的文本文件,需用文本编辑器编写文件由元素构成的文本文件,需用文本编辑器编写保存。保存。nDTD文件扩展名为文件扩展名为.dtd。n在保存在保存DTD文件时,文件时,DTD文件的编码必须和其关联的文件的编码必须和其关联的XML文件一致。文件一致。也就是如果也就是如果XML文件的编码为文
9、件的编码为UTF-8,那么那么XML关联的关联的DTD文件也必须依照文件也必须依照UTF-8编码保存。编码保存。 153.1.3XML与与DTD的关联形式的关联形式一个一个XML文件只有和某个文件只有和某个DTD文件相关文件相关联,才会受到该联,才会受到该DTD文件的约束。文件的约束。XML文件使用文件使用文档类型声明文档类型声明与一个与一个DTD相关联相关联,有两种形式的关联:,有两种形式的关联:SYSTEM和和PUBLIC。nSYSTEM关联表明所关联的关联表明所关联的DTD文件由文件由个人或工作小组所定义且认可。个人或工作小组所定义且认可。nPUBLIC关联表明所关联的关联表明所关联的D
10、TD文件已经文件已经得到某一领域的认可,是经过许多人讨论得到某一领域的认可,是经过许多人讨论得到认可的得到认可的DTD文件。文件。16SYSTEM关联关联 SYSTEM关联型的文档类型声明格式:关联型的文档类型声明格式:例如:例如: SYSTEM关联表明所关联的关联表明所关联的DTD文件由文件由个或工作小组所定义且认可个或工作小组所定义且认可 17PUBLIC关联关联 PUBLIC关联型的文档类型声明格式:关联型的文档类型声明格式:例如:例如: PUBLIC关联表明所关联的关联表明所关联的DTD文件已经得到文件已经得到某一领域的认可,是经过许多人讨论得到认可的某一领域的认可,是经过许多人讨论得
11、到认可的DTD文件。文件。 18FPI正式公用标识符正式公用标识符FPI的格式为:的格式为:“-/ISO认证认证/单位名称单位名称/DTD说明说明/所用语言所用语言”FPI中不可以含有非中不可以含有非ASII码字符。码字符。19DTD文件的位置文件的位置nSYSTEM和和PUBLIC格式的文档类型声格式的文档类型声明中提到的:明中提到的:“DTD文件文件URI”nDTD文件的文件的URI必须是一个有效的资源,必须是一个有效的资源,如果如果URI是一个文件的名字,该文件必须是一个文件的名字,该文件必须和当前和当前XML文件在同一目录中;如果文件在同一目录中;如果URI是一个链接,该链接地址必须是
12、可访问的,是一个链接,该链接地址必须是可访问的,使用使用URI可以使许多组织的可以使许多组织的XML文件共享文件共享同一个同一个DTD文件。文件。20example3_2.xml国贸大厦国贸大厦08:3018:30 华联商场华联商场07:3022:30 21现在看一个简单的现在看一个简单的DTD文件以及它是怎样约束文件以及它是怎样约束XML文件的数据结构。假设编写一个关于学生文件的数据结构。假设编写一个关于学生的入学时间、毕业时间信息的的入学时间、毕业时间信息的XML文件,其中文件,其中根标记是根标记是“学生学生”。#PCDATA表示文本数据,可以含有普通字符、表示文本数据,可以含有普通字符、
13、字符引用、实体引用或者是字符引用、实体引用或者是CDATA段的内容。段的内容。22例子例子1 1dtdFile.dtd23Cha3_1.xml 23点点 12分分 23点点 12分分 08点点 45分分 19点点 36分分 243.2怎样检查有效性怎样检查有效性 浏览器的浏览器的XML解析器只检查解析器只检查XML文件文件是否是规范的。当用浏览器打开一个有效是否是规范的。当用浏览器打开一个有效的的XML文件时,浏览器的文件时,浏览器的XML解析器仅解析器仅仅检查仅检查XML文件所关联的文件所关联的DTD文件是否文件是否有语法错误,并有语法错误,并不检查不检查XML文件是否遵守文件是否遵守该该D
14、TD规定的约束条件规定的约束条件。可以使用可以使用DOM 解析器来检查一个解析器来检查一个XML文件是否是有效的。文件是否是有效的。 25TestValidate.javaimport javax.xml.parsers.*;import org.xml.sax.helpers.*;import org.xml.sax.*;import java.io.*;import org.w3c.dom.*;import java.util.Scanner;public class TestValidate public static void main(String args) String file
15、Name=null; try Scanner reader=new Scanner(System.in); System.out.println(请输入要验证有效性的文件名字:请输入要验证有效性的文件名字:); fileName=reader.nextLine(); DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance(); 例子例子2 26factory.setValidating(true); DocumentBuilder builder= factory. newDocumentBuilder(); MyH
16、andler handler=new MyHandler(); builder.setErrorHandler(handler); Document document=builder.parse(new File(fileName) ; if(handler.errorMessage=null) System.out.println(XML文件是有效的文件是有效的); else System.out.println(XML文件不是有效的文件不是有效的); catch(Exception e) System.out.println(e); 27class MyHandler extends De
17、faultHandler String errorMessage=null; public void error(SAXParseException e) throws SAXException errorMessage=e.getMessage(); System.out.println(一般错误:一般错误:+errorMessage); public void fatalError(SAXParseException e) throws SAXException errorMessage=e.getMessage(); System.out.println(致命错误:致命错误:+error
18、Message); 283.3 DTD中的元素中的元素 DTD中的元素(中的元素(ELEMENT)是用来约束)是用来约束XML文件中的标记,在文件中的标记,在DTD中使用元素声明来定义中使用元素声明来定义一个元素,元素的声明格式为:一个元素,元素的声明格式为: 例如:例如: 约束标记约束标记“列车时刻表列车时刻表” 只可以有且必须有只可以有且必须有两个子标记两个子标记“T28次次”和和“T29次次”。特别强调的特别强调的2点:点:nDTD文件中元素的作用与其在文件中元素的作用与其在DTD文件中的书写位置无文件中的书写位置无关。关。n在在DTD文件中不能使用多个元素约束同一个标记,即使文件中不能
19、使用多个元素约束同一个标记,即使它们的约束条件相同。它们的约束条件相同。293.3.1约束标记只包含文本数据约束标记只包含文本数据n如果约束一个标记没有子标记,也就是说约束标记只能如果约束一个标记没有子标记,也就是说约束标记只能包含文本数据。包含文本数据。n下列下列3个标记符合要求:个标记符合要求:n张三张三nn30限制标记只有文本数据限制标记只有文本数据关键字关键字#PCDATA约束标记的文本数约束标记的文本数据中可以有据中可以有:n普通字符,普通字符,nCDATA段中的内容段中的内容n字符引用字符引用n实体引用。实体引用。当一个标记使用这样的约束时,该标记的当一个标记使用这样的约束时,该标
20、记的文本数据也可以只由一个文本数据也可以只由一个“空字符空字符”组成。组成。31例如例如下列下列“Hello”标记都是符合约束条件标记:标记都是符合约束条件标记:你好你好你好你好而下列不符合约束条件:而下列不符合约束条件:你好你好hello323.3.2规定标记的子标记规定标记的子标记 如果想约束如果想约束XML文件中某个标记可以有怎文件中某个标记可以有怎样的子标记,比如,标记必须有哪些子标样的子标记,比如,标记必须有哪些子标记,子标记是否允许重复出现、出现的顺记,子标记是否允许重复出现、出现的顺序如何等,那么序如何等,那么 DTD中元素声明的中元素声明的“标标记的约束条件记的约束条件”是用小
21、括号括起的子标记是用小括号括起的子标记列表,格式为列表,格式为333.3.2规定标记的子标记规定标记的子标记XML文件中的标记可以含有文本数据和子文件中的标记可以含有文本数据和子标记,如果在标记,如果在DTD文件中使用上述约束条文件中使用上述约束条件的元素,这样的元素将约束件的元素,这样的元素将约束XML文件中文件中相应的标记相应的标记只可以有子标记,不可以含有只可以有子标记,不可以含有能显示的文本数据能显示的文本数据,即文本数据仅仅可以,即文本数据仅仅可以由空白类字符所组成。由空白类字符所组成。“子标记列表子标记列表”约束标记可以有哪些子标约束标记可以有哪些子标记及它们在父标记中出现的先后顺
22、序。记及它们在父标记中出现的先后顺序。“子标记列表子标记列表”是用逗号分隔列出的若干是用逗号分隔列出的若干个标记,每个标记称做个标记,每个标记称做“子标记列表子标记列表”的的一个分项一个分项。34例如:例如:要求标记要求标记“开车时间开车时间” 恰好有两个子标记恰好有两个子标记“hour”和和“minute”,不可以有能显示,不可以有能显示的文本数据,并且子标记在父标记的文本数据,并且子标记在父标记“开车开车时间时间”中出现的顺序必须是中出现的顺序必须是“hour”、“minute”而不是而不是 “minute”、“hour”. . 3504点点58分分不可以将不可以将T28标记写成标记写成5
23、8分分04点点不可以将不可以将“开车时间开车时间”标记写成含有可显示文本标记写成含有可显示文本“特快列车特快列车”特快列车特快列车04点点58分分36子标记出现的次数子标记出现的次数子标记列表中的每个子标记的后面可以尾加限定子标记列表中的每个子标记的后面可以尾加限定符号来限定该子标记出现的次数。符号来限定该子标记出现的次数。不尾加限定符不尾加限定符号的子标记必须出现且只能出现一次。号的子标记必须出现且只能出现一次。限定符号限定符号有:有:+:尾加该限定符号的子标记必须出现一次或多次。尾加该限定符号的子标记必须出现一次或多次。*:尾加该限定符号的子标记可出现零次或多次。尾加该限定符号的子标记可出
24、现零次或多次。?:尾加该限定符号的子标记可出现零次或一次。尾加该限定符号的子标记可出现零次或一次。例如:例如:37分项的或运算分项的或运算子标记列表的分项也可以是几个标记的子标记列表的分项也可以是几个标记的“或或运算运算”,而且或运算必须用小括号括起来。,而且或运算必须用小括号括起来。例如:例如:38例子例子3dtdFile.dtd39Cha3_3.xml 张林将张林将 北京大学计算机理学硕士北京大学计算机理学硕士 获获2005年度光华奖学金年度光华奖学金 获获2003年度一等奖学金年度一等奖学金 2004被一次警告处分被一次警告处分 男男 李小黎李小黎 清华大学自动化专业工学博士清华大学自动
25、化专业工学博士 获获2003年度光华奖学金年度光华奖学金 女女 王劲劲王劲劲 南京大学文学系文学学士南京大学文学系文学学士 女女 40规定标记的混合内容规定标记的混合内容 一个标记的内容可以有两部分构成:文本一个标记的内容可以有两部分构成:文本数据和标记,其中的标记称做该标记的子数据和标记,其中的标记称做该标记的子标记。标记。格式如下:格式如下: 41错误的写法错误的写法(#PCDATA|子标记子标记1|子标记子标记2|子标记子标记m)其错误是未用其错误是未用“* *”字符结尾;字符结尾;(#PCDATA|子标记子标记1|子标记子标记2|子标记子标记m)+ +其错误是使用其错误是使用“+”字符
26、结尾;字符结尾;(#PCDATA|子标记子标记1|子标记子标记2|子标记子标记m)?)?其错误是使用其错误是使用“?”字符结尾;字符结尾;(#PCDATA,子标记子标记1,子标记子标记2,子标记子标记m)子标记列表不能有子标记列表不能有“#PCDATA”分项。分项。约束标记的混合内容元素的缺点是:约束标记的混合内容元素的缺点是:只能约束该标记可只能约束该标记可以有哪些子标记,不能约束这些子标记出现的次数和出以有哪些子标记,不能约束这些子标记出现的次数和出现的顺序。另外,约束条件中也不能使用限制符号,下现的顺序。另外,约束条件中也不能使用限制符号,下列写法是错误的。列写法是错误的。(#PCDAT
27、A|子标记子标记1+|子标记子标记2*|子标记子标记m?)42fiveDTD.dtd43 张三张三 1993-12-12 男男 孙翠花孙翠花 1992-01-31 女女 44例子例子4dtdFile.dtd45Cha3_4.xml K83 次特快列车次特快列车 20点点36分分 20点点36分分 16点点36分分 07点点12分分 09点点16分分 K18 次特快列车次特快列车 09点点16分分 K18 次特快列车次特快列车 16点点36分分 464 EMPTY和和ANY n 如果准备约束一个标记是空标记,或者如果准备约束一个标记是空标记,或者是只含有空字符的非空标记,元素的是只含有空字符的非
28、空标记,元素的“标标记的约束条件记的约束条件”可以是关键字可以是关键字“EMPTY”;nn如果不准备对一个标记有任何约束,元如果不准备对一个标记有任何约束,元素的素的“标记的约束条件标记的约束条件”可以是关键字可以是关键字“ANY”。例如:。例如:n47下列标记都是符合约束条件的标记下列标记都是符合约束条件的标记qweqwe而下列标记都是不符合约束条件的标记而下列标记都是不符合约束条件的标记How are you 48493.4 DTD的完整性的完整性 一个一个DTD文件必须是完整的,即满足:文件必须是完整的,即满足:(1 1)不允许无穷嵌套)不允许无穷嵌套 如果一个如果一个DTD元素约束某个
29、标记可以出现某个子标记,元素约束某个标记可以出现某个子标记,那么对该子标记进行约束的那么对该子标记进行约束的DTD元素就不能约束该标记元素就不能约束该标记的子标记是它的父标记。下列是错误的。的子标记是它的父标记。下列是错误的。!ELEMENT (name,price)!ELEMENT price(,unit)!ELEMENT )!ELEMENT )3.4 DTD的完整性的完整性 (2 2)XMLXML文件中的每个标记都必须在文件中的每个标记都必须在DTDDTD中有相应元素进行中有相应元素进行约束。约束。下列下列DTDDTD文件是不完整的。文件是不完整的。!ELEMENT )!ELEMENT T
30、28(hour,minute)!ELEMENT T29(minute,hour)!ELEMENT )!ELEMENT )!ELEMENT (#PCDATA)50513.5 DTD中的属性约束列表中的属性约束列表 属性是指标记的属性,可以为标记添加附加信息。属性是指标记的属性,可以为标记添加附加信息。属性是一个名值对,即属性必须由名字和值组成。属性是一个名值对,即属性必须由名字和值组成。属性必须在非空标记的开始标记或空标记中声明,属性必须在非空标记的开始标记或空标记中声明,用用“=”为属性指定一个值。例如,我们可为标为属性指定一个值。例如,我们可为标记记“桌子桌子”添加三个属性:添加三个属性:一
31、个信息是否作为一个标记的附加信息或作为该一个信息是否作为一个标记的附加信息或作为该标记的子标记,这取决于具体的问题。标记的子标记,这取决于具体的问题。一个基本一个基本的原则的原则:不要因为属性的频繁使用而破坏稳当的:不要因为属性的频繁使用而破坏稳当的结构。结构。523.5.1ATTLIST属性约束列表属性约束列表DTD中的属性列表(中的属性列表(ATTLIST)可用来约束)可用来约束XML文件中标文件中标记的属性,在记的属性,在DTD中属性列表的声明格式为:中属性列表的声明格式为:例如:例如:注意:对于有效的注意:对于有效的XML文件,对于标记中添加的每个属性,在文件,对于标记中添加的每个属性
32、,在DTD中都必须有相应的中都必须有相应的ATTLIST声明给予约束。声明给予约束。例例6sixDTD.dtd!ELEMENT )!ELEMENT )!ELEMENT (#PCDATA)!ELEMENT (#PCDATA)!ATTLIST width CDATA “8m”!ATTLIST length CDATA “15m”53example3-6.xmlexample3-6.xml!DOCTYPE SYSTEM sixDTD.dtd A101A101 自习室自习室/ / width=“10m” length=“16m” A606A606 语音室语音室/ / / 浏览器的解析器认为它有名字为浏
33、览器的解析器认为它有名字为width和和length的属性,且的属性,且属性值是属性值是DTD文件中属性列表约束给出的默认值。文件中属性列表约束给出的默认值。5455属性名称属性名称”、“属性类型属性类型”和和“默认值情况默认值情况”在在ATTLIST声明中,涉及到声明中,涉及到“属性名称属性名称”“”“属性类型属性类型”和和“默认值默认值情况情况”,其意义分别阐述如下:,其意义分别阐述如下:(1)属性名称)属性名称 属性名称的命名规则和标记的命名规则相同,可以由字母、数字、属性名称的命名规则和标记的命名规则相同,可以由字母、数字、下划线(下划线(“_”)、点()、点(“.”)或连字符()或连
34、字符(“-”)组成,但必须以字)组成,但必须以字母或下划线开头。属性的名称区分大小写。母或下划线开头。属性的名称区分大小写。(2)属性类型)属性类型 我们已经知道属性值一定是一个字符串,那么属性类型就决定了属我们已经知道属性值一定是一个字符串,那么属性类型就决定了属性可以用怎样的字符串作为属性的值。无论何种类型的属性,其属性可以用怎样的字符串作为属性的值。无论何种类型的属性,其属性值中都不能含有左尖括号,右尖括号,与符号,单引号和双引号。性值中都不能含有左尖括号,右尖括号,与符号,单引号和双引号。如果想用这些值,可以使用实体引用。属性值区分大小写。如果想用这些值,可以使用实体引用。属性值区分大
35、小写。(3)默认值情况)默认值情况 ATTLIST声明中关于属性的声明中关于属性的“默认值情况默认值情况”是对是对XML文件中标记文件中标记的属性进行约束的细节条件。的属性进行约束的细节条件。562属性的默认值属性的默认值声明中包括声明中包括“属性名称属性名称”、“属属性类型性类型”和和“默认值情况默认值情况”,其中的,其中的“默认值情默认值情况况”含有约束的细节条件。含有约束的细节条件。 “默认值情况默认值情况”对对标记中的属性的约束意义的表述。标记中的属性的约束意义的表述。 默认值情况默认值情况约束意义约束意义字符串字符串标记必须有该属性,且有默认值标记必须有该属性,且有默认值#IMPLI
36、ED标记可以没有该属性,没有默认值标记可以没有该属性,没有默认值#REQUIRED标记必须有该属性,没有默认值标记必须有该属性,没有默认值#FIXED “字符串字符串” 标记可以没有该属性,但如果有该属性,那么属性值标记可以没有该属性,但如果有该属性,那么属性值固定不变固定不变57以下就以下就“默认值情况默认值情况”的几种情况详细讨论如下的几种情况详细讨论如下 (1)字符串)字符串 如果某个属性的如果某个属性的“默认值情况默认值情况”是一个字是一个字符串,符串, XML中对应标记中对应标记必须有该属性,必须有该属性,但标记可以不明显地添加该属性。但标记可以不明显地添加该属性。如果不如果不明显地
37、添加该属性,解析器也认为该标记明显地添加该属性,解析器也认为该标记有这个属性,并且默认值为有这个属性,并且默认值为DTDDTD文件中文件中ATTLISTATTLIST声明给定的字符串。声明给定的字符串。!ATTLIST height CDATA 160!ATTLIST color CDATA red 58举例举例5 5dtdFile.dtdCha3_5.xml 红桌子红桌子 大小如何?大小如何? 举例举例7 7sevenDTD.dtd!ATTLIST example3_7.xml 电视机电视机2678元元/台台 东北大米东北大米5.9元元/斤斤 5960(2)#IMPLIED 当 属 性 的当
38、 属 性 的 “ 默 认 值 情 况默 认 值 情 况 ” 是 关 键 字是 关 键 字“#IMPLIED”时,该属性就没有默认值,时,该属性就没有默认值,而且相应的标记里可以不使用该属性。而且相应的标记里可以不使用该属性。当当认为一个属性可有可无,且没有认为一个属性可有可无,且没有默认值时,默认值时,就可以将属性的就可以将属性的“默认值情况默认值情况”设置为设置为“#IMPLIED”。61(3)#REQUIRED 当 属 性 的当 属 性 的 “ 默 认 值 情 况默 认 值 情 况 ” 是 关 键 字是 关 键 字“#REQUIRED”时,该属性没有默认时,该属性没有默认值,相应的标记必须
39、要添加该属性并给值,相应的标记必须要添加该属性并给出属性的值。出属性的值。 当我们不想为某个属性设置默认值,但要当我们不想为某个属性设置默认值,但要求标记里必须有该属性时,就可以将属性求标记里必须有该属性时,就可以将属性的的“默认值情况默认值情况”设置为设置为“#REQUIRED”。62(4)#FIXED当属性的当属性的“默认值情况默认值情况”是关键字是关键字“#FIXED”和一个字符串和一个字符串时,该属性的默认值就是关键字时,该属性的默认值就是关键字“# FIXED”后面指定的那后面指定的那个字符串。个字符串。 在编写在编写XMLXML文件时,即使被约束的标记不显示的附加该属性,文件时,即
40、使被约束的标记不显示的附加该属性,解析器也认为该标记有这个属性,而且属性值是关键字解析器也认为该标记有这个属性,而且属性值是关键字“#FIXED” 指定的字符串。指定的字符串。但如果标记显示添加该属性,但如果标记显示添加该属性,那么不可以改变属性的值,即该属性的值必须是关键字那么不可以改变属性的值,即该属性的值必须是关键字“#FIXED” 指定的字符串。指定的字符串。 63目前,浏览器内置的目前,浏览器内置的XML解析器只检查解析器只检查XML关联的关联的DTD文件本身是否有错,但文件本身是否有错,但不检查不检查XML文件是否遵守了文件是否遵守了DTD文件的文件的约束条件。约束条件。如果你只想
41、检查有效性,也可以使用如果你只想检查有效性,也可以使用3.2节中的解析器。节中的解析器。例例8eightDTD.dtdexample3_8.xml 物理系专用物理系专用英语系专用英语系专用老师课间休息专用老师课间休息专用学生课间休息专用学生课间休息专用64例例9nineDTD.dtd6566例子例子6dtdFile.dtdCha3_6.xml 交通工具交通工具 农用车农用车 67TestAttsOne.javaimport javax.xml.parsers.*;import org.xml.sax.helpers.*;import org.xml.sax.*;import java.io.*
42、;public class TestAttsOne public static void main(String args) try SAXParserFactory factory=SAXParserFactory.newInstance() ; factory.setValidating(true); factory.setNamespaceAware (true); SAXParser saxParser=factory.newSAXParser(); MyHandlerOne handler=new MyHandlerOne (); saxParser.parse(new File(c
43、ha3_6.xml),handler); catch(Exception e) System.out.println(e); 68class MyHandlerOne extends DefaultHandler public void startElement(String uri,String localName,String qName,Attributes atts) System.out.print(); System.out.println(该标记的属性:该标记的属性:); for(int k=0;katts.getLength();k+) System.out.print(属性名
44、称:属性名称:); System.out.print(atts.getLocalName(k)+ ); System.out.print(属性类型:属性类型:); System.out.print(atts.getType(k)+ ); System.out.print(属性的值:属性的值:); System.out.print(atts.getValue(k)+ ); public void endElement(String uri,String localName,String qName) System.out.println(); public void error(SAXParse
45、Exception e) throws SAXException String errorMessage=e.getMessage(); System.out.println(一般错误:一般错误:+errorMessage); 69例子例子7dtdFile.dtdCha3_7.xml 不要乱打报警电话。不要乱打报警电话。 一旦发生火灾,请及时拨打一旦发生火灾,请及时拨打119。 70TestAttsTwo.javaimport javax.xml.parsers.*;import org.xml.sax.helpers.*;import org.xml.sax.*;import java.io
46、.*;import org.w3c.dom.*;public class TestAttsTwo public static void main(String args) OutContent outContent=new OutContent(); try DocumentBuilderFactory factory= DocumentBuilderFactory. newInstance(); factory.setValidating(true); DocumentBuilder builder= factory. newDocumentBuilder(); builder.setErr
47、orHandler(new MyHandlerTwo (); Document document= builder. parse(new File(cha3_7.xml) ; Element root=document.getDocumentElement() ; String rootName=root.getNodeName(); System.out.println(XML文件根节点的名字:文件根节点的名字:+rootName); NodeList nodeList=root.getChildNodes(); outContent.output(nodeList); catch(Exce
48、ption e) System.out.println(e); 71class OutContent public void output(NodeList nodeList) int size=nodeList.getLength(); for(int k=0;ksize;k+) Node node=nodeList.item(k); if(node.getNodeType()=Node.ELEMENT_NODE) Element elementNode=(Element)node; String name=elementNode.getNodeName(); System.out.prin
49、t(name); /获取标记的全部属性获取标记的全部属性 NamedNodeMap map=elementNode.getAttributes(); for(int j=0;jmap.getLength();j+) Attr attrNode=(Attr)map.item(j); String attName=attrNode.getName(); String attValue=attrNode.getValue(); System.out.println( 属性名称及值属性名称及值:+attName+=+attValue); NodeList nodes=elementNode.getCh
50、ildNodes(); output(nodes); 72class MyHandlerTwo extends DefaultHandler public void error(SAXParseException e) throws SAXException String errorMessage=e.getMessage(); System.out.println(一般错误:一般错误:+errorMessage); 733属性类型属性类型属性类型决定了属性可以用怎样的字符串作为属属性类型决定了属性可以用怎样的字符串作为属性的值。属性的常用类型有:性的值。属性的常用类型有:1.CDATA2.E
51、numerated3.NMTOKEN4.NMTOKENS5.ID6.IDREF7.IDREFS以下分别来介绍这些属性类型。以下分别来介绍这些属性类型。74(1)CDATA类型类型对于对于CDATA(Character Data)类型)类型的属性,的属性,该属性的值可以是任何一个字符该属性的值可以是任何一个字符串串,但是,字符串中不能含有左尖括号、,但是,字符串中不能含有左尖括号、右尖括号、与符号、单引号和双引号,如右尖括号、与符号、单引号和双引号,如果想使用这些字符,果想使用这些字符,可以使用字符引用或可以使用字符引用或实体引用。实体引用。下面的例子下面的例子10说明了说明了CDATA类型属性
52、的用类型属性的用法。可用例子法。可用例子2中的解析器验证中的解析器验证XML文件文件是否有效。是否有效。75例子例子10tenDTD.dtdexample3_10.xml 张飞张飞 李奎李奎 76(2)Enumerated 类型类型如果属性的类型是如果属性的类型是Enumerated 类型,那么该类型,那么该属性只可以取枚举出的值。属性只可以取枚举出的值。Enumerated不是不是关键字,是指类型定义的格式,其格式是将属性关键字,是指类型定义的格式,其格式是将属性可以取的值用符号可以取的值用符号“|”分隔,分隔,Enumerated 类类型的定义格式如下:型的定义格式如下:对于对于Enume
53、rated类型,属性值可以由字母、类型,属性值可以由字母、数字、下划线、点或连字符组成,数字、下划线、点或连字符组成,并允许首字符并允许首字符是数字字符是数字字符。77例子例子9dtdFile.dtdCha3_9.xml 张三张三 翠花翠花 例例11elevenDTD.dtdexample3_11.xml 10010中山路中山路 20011长江路长江路 7879(3)NMTOKEN类型类型 如果属性的类型是如果属性的类型是NMTOKEN类型的属性,属性值可以类型的属性,属性值可以由字母、数字、下划线(由字母、数字、下划线(“_”)、点()、点(“.”)或连字符)或连字符(“-”)组成,)组成,
54、属性值中不能含有空格字符(属性值也属性值中不能含有空格字符(属性值也可以用数字、点或连字符开头)可以用数字、点或连字符开头)。dtdFile.dtd 80Cha3_10.xml !CDATA 张小三张小三 例子例子10例例12twelveDTD.dtdexample3_12.xml 张三张三 李陶李陶8182(4)NMTOKENS类型类型我们已经知道,对于我们已经知道,对于NMTOKEN类型的类型的属性,其属性值中不能含有空白类字符。属性,其属性值中不能含有空白类字符。如果需要某个属性的属性值含有空白类字如果需要某个属性的属性值含有空白类字符,而且被空白分隔开的子字符串符合符,而且被空白分隔开
55、的子字符串符合NMTOKEN类型属性的属性值之规定,类型属性的属性值之规定,那么就可以将属性的类型取为那么就可以将属性的类型取为NMTOKENS类型。类型。 83例子例子11dtdFile.dtdCha3_11.xml 本论文详细讨论了线段自映射的拓扑熵和本论文详细讨论了线段自映射的拓扑熵和Li-yorke混沌之间的关系混沌之间的关系 本论文详细讨论了基于本论文详细讨论了基于SOAP通信中通信中XML文件的作用。文件的作用。 例例13thirteenDTD.dtdexample3_13.xml XML基础教程基础教程清华大学出版社清华大学出版社 Java程序设计程序设计清华大学出版社清华大学出
56、版社 8485(5)ID类型类型ID类型的属性的属性值具有互斥性,即所有类型的属性的属性值具有互斥性,即所有ID类型的属性的属性类型的属性的属性值必须互不相同。值必须互不相同。 如果希望某个属性的属性值具有专用性,如果希望某个属性的属性值具有专用性,即不即不允许其他类型相同允许其他类型相同(ID类型类型)的属性再使用这个属性值的属性再使用这个属性值,那么就可,那么就可以将属性的类型取为以将属性的类型取为ID类型。类型。需要注意的是,需要注意的是,ID类型的属性值可以由字母、数字、下划线、点类型的属性值可以由字母、数字、下划线、点或连字符组成,但必须以字母或下划线开头。或连字符组成,但必须以字母
57、或下划线开头。需要特别注意的是需要特别注意的是ID类型属性的默认值情况只能是类型属性的默认值情况只能是“#REQUIRED”和和“#IMPLIED”,不可以是,不可以是“字符串字符串”或或#FIXED“字符串字符串”。 一个标记的若干属性中不允许有一个标记的若干属性中不允许有2个属性的类型都是个属性的类型都是ID。86例如,下列例如,下列ID类型属性的类型属性的“默认值情况默认值情况”是错误的。是错误的。下列下列ID类型属性的类型属性的“默认值情况默认值情况”是正确的。是正确的。 87例子例子12dtdFile.dtdCha3_12.xml Java基础教程基础教程 JSP基础教程基础教程 I
58、D类型的属性值的专用性仅类型的属性值的专用性仅限于限于ID类型的属性,并不干类型的属性,并不干涉其他类型属性的属性值。涉其他类型属性的属性值。例例14fourteenDTD.dtdexample3_14.xml 101无轨电车无轨电车 201有轨电车有轨电车 801快车快车 631普通普通 ID类型类型 属性的属性值的专用性仅限于属性的属性值的专用性仅限于ID类型的属性,并不干涉其它类型属性的属性类型的属性,并不干涉其它类型属性的属性值。也就是说若干个类型都是值。也就是说若干个类型都是ID类型的属性的属性值必须互不相同,如果另外一个类型的属性的属性值必须互不相同,如果另外一个属性的类型不是属性
59、的类型不是ID类型,那么它的属性值可以和某个类型,那么它的属性值可以和某个ID类型的属性的属性值不相同。类型的属性的属性值不相同。一个标记的若干属性中,不允许有两个属性的类型都是一个标记的若干属性中,不允许有两个属性的类型都是ID。8889(6)IDREF类型类型如果准备通过标记的属性值来判断标记之如果准备通过标记的属性值来判断标记之间的联系,就可以在标记中使用间的联系,就可以在标记中使用IDREF类类型的属性。型的属性。IDREF类型属性的属性值只能取某个标记类型属性的属性值只能取某个标记中中ID类型属性的属性值。类型属性的属性值。例如,某个标记有一个例如,某个标记有一个ID类型的属性,取类
60、型的属性,取值为值为a1234,如果我们希望通过属性值来,如果我们希望通过属性值来寻找该标记的子孙标记,就可以将子标记寻找该标记的子孙标记,就可以将子标记的某个属性的类型设置为的某个属性的类型设置为IDREF类型,并类型,并取值为取值为a1234。90例子例子13dtdFile.dtdCha3_13.xml 例子例子15fifteenDTD.dtd91例子例子15 张三张三 李四李四 赵五赵五 孙六孙六9293(7)IDREFS类型类型 我们可能希望约束某个属性的属性值是若干个其他我们可能希望约束某个属性的属性值是若干个其他ID属属性的属性值组合,性的属性值组合,IDREFS类型属性的属性值能满足这类型属性的属性值能满足这一愿望。一愿望。对于对于IDREFS类型的属性,它的值可以是用类型的属性,它的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO/IEC/IEEE 41062:2024 EN Software engineering - Life cycle processes - Software acquisition
- 【正版授权】 ISO 10924-4:2025 EN Road vehicles - Circuit breakers - Part 4: Medium circuit breakers with tabs (Blade type),Form CB15
- 【正版授权】 IEC TR 61364:1999 EN-D Nomenclature for hydroelectric powerplant machinery
- 2025年元旦晚会策划方案模板
- 元宵节主题活动方案2025年(精彩)
- 2025年幼儿园新学期个人工作方案
- 时尚知识全解析
- 护理科研文献检索与管理
- 护理临床教学病案讨论
- 生产简历工作总结
- 生物特征识别技术中的安全和隐私
- 社会组织负责人备案表(社团)
- 电动车骑行免责协议书范本
- 会阴穴的穴位刺激对疾病的影响
- 质量检测工程合同范本
- 《自然教育》课件-自然游戏
- 部编版语文一年级下册第六单元大单元教学任务群设计
- 高考地理总复习考点提分题(全国)专练04 人文地理(选择题专项80题)(原卷版)
- 金华2024年浙江金华职业技术学院招聘7人(第二批)笔试历年典型考题及考点附答案解析
- 脊柱侧弯矫正的七大门派
- DZ/T 0430-2023 固体矿产资源储量核实报告编写规范(正式版)
评论
0/150
提交评论