XML基础教程第3章_第1页
XML基础教程第3章_第2页
XML基础教程第3章_第3页
XML基础教程第3章_第4页
XML基础教程第3章_第5页
已阅读5页,还剩120页未读 继续免费阅读

下载本文档

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

文档简介

1第3章有效的XML文件2第3章有效的XML文件3.1有效的XML文件的定义3.2如何检查有效性3.3DTD中的元素3.4DTD的完整性3.5DTD中的属性3.6DTD中的实体3.7可解析实体与不可解析实体3.8DTD中的参数实体3.9内部DTD3.10IGNORE和INCLUDE3.11DTD的名称空间3第3章

有效的XML文件

规范性仅仅是XML语言的基本语法,没有对XML文件怎样组织数据进行具体的限制,对同一问题编写的XML文件,在数据组织结构上就可能有很大的不同。

Time1.xml和Time2.xml

4列车时刻Time1.xml<?xmlversion=“1.0”encoding=“UTF-8”?><火车时刻表> <T28>

开车时间:20点58分

</T28></火车时刻表>Time2.xml<?xmlversion=“1.0”encoding=“UTF-8”?><火车时刻表> <T28>

开车时间:

<hour>20点</hour> <minute>58分</minute> </T28></火车时刻表>5商店营业时间STime1.xml<?xmlversion=“1.0”encoding=“UTF-8”?><商店营业时间> <商店><商店名称>国贸大厦</商店名称> <营业时间>08:30至18:30</营业时间> </商店> <商店><商店名称>华联商场</商店名称> <营业时间>07:30至22:30</营业时间> </商店></商店营业时间>6商店营业时间STime2.xml<?xmlversion=“1.0”encoding=“UTF-8”?><商店营业时间> <商店> <商店名称>国贸大厦</商店名称> <开门时间>08:30</开门时间> <关门时间>18:30</关门时间> </商店> <商店> <商店名称>华联商场</商店名称> <开门时间>07:30</开门时间> <关门时间>22:30</关门时间> </商店></商店营业时间>73.1有效的XML文件定义

对XML数据进行约束的主要原因:一是使XML的数据组织更加合理,符合系统要求;二是便于维护XML中的数据,从而提高整个系统的可维护性。 针对某些问题,有时可能需要对XML文件怎样组织数据,即数据结构,进行必要的限制,以便解析器能更好解析其中的数据。83.1有效的XML文件定义

对XML的数据结构进行限制有两种方式:使用文档类型定义(DocumentTypeDefinition,DTD)和XMLSchema模式。但二者最重要的区别是XMLSchema是一个特殊的XML文件,而DTD是有独立语法结构的文件。

DTD的使用要早与XMLSchema模式,DTD和XMLSchema模式各有所长,但XMLSchema模式比DTD更为复杂。本章主要讨论DTD,以及怎样使用它约束XML文件。

一个规范的XML文件如果和某个DTD文件相关联,并遵守DTD文件规定的限制条件,就称为有效的XML文件。93.1.1初识DTD

下面用一个简单例子说明如何使用DTD文件来约束XML文件中的数据结构。

需要一个刻画商店营业时间的XML文件,但数据结构必须符合下列要求:根标记名称为:商店营业时间根标记可以有若干个名称为“商店”的子标记。名称为“商店”的标记顺序地包含有名称为“商店名称”“开门时间”“关门时间”的子标记。名称为“商店名称”的标记包含的内容只能是文本数据,不能有子标记。名称为“开门时间”的标记包含的内容只能是文本数据,不能有子标记。名称为“关门时间”的标记包含的内容只能是文本数据,不能有子标记。103.1.1初识DTD DTD文件是由元素所构成的文本文件。在DTD文件中,用关键字ELEMENT来定义一个元素,格式如下:<!ELEMENT标记名称标记的约束条件>

注意:在DTD文件中,元素的定义用“<!ELEMENT”开始,以“>”结束。要特别注意的是“<!ELEMENT”中的“<、!、ELEMENT”间不要有空格。11limitShop.dtd<!ELEMENT商店营业时间(商店*)><!ELEMENT商店(商店名称,开门时间,关门时间)><!ELEMENT商店名称(#PCDATA)><!ELEMENT开门时间(#PCDATA)><!ELEMENT关门时间(#PCDATA)>12商店营业时间STime2.xml<?xmlversion=“1.0”encoding=“UTF-8”?><商店营业时间> <商店> <商店名称>国贸大厦</商店名称> <开门时间>08:30</开门时间> <关门时间>18:30</关门时间> </商店> <商店> <商店名称>华联商场</商店名称> <开门时间>07:30</开门时间> <关门时间>22:30</关门时间> </商店></商店营业时间>13注意:

某些书将XML文件中的标记也称为元素,本书为符合WEB设计中的习惯,没有在XML文件使用元素这一术语,而使用标记这一术语。

需要特别提到的是,DTD中的元素和XML文件中的标记的语法格式有很大不同。

143.1.2DTD文件的保存DTD文件由元素构成的文本文件,需用文本编辑器编写保存。DTD文件扩展名为.dtd。在保存DTD文件时,DTD文件的编码必须和其关联的XML文件一致。也就是如果XML文件的编码为UTF-8,那么XML关联的DTD文件也必须依照UTF-8编码保存。153.1.3XML与DTD的关联形式

一个XML文件只有和某个DTD文件相关联,才会受到该DTD文件的约束。

XML文件使用文档类型声明与一个DTD相关联,有两种形式的关联:SYSTEM和PUBLIC。SYSTEM关联表明所关联的DTD文件由个人或工作小组所定义且认可。PUBLIC关联表明所关联的DTD文件已经得到某一领域的认可,是经过许多人讨论得到认可的DTD文件。16SYSTEM关联

SYSTEM关联型的文档类型声明格式:<!DOCTYPE根标记的名称

SYSTEM"DTD文件的URI">例如:<!DOCTYPE商店营业时间SYSTEM“limitShop.dtd">SYSTEM关联表明所关联的DTD文件由个或工作小组所定义且认可

17PUBLIC关联

PUBLIC关联型的文档类型声明格式:<!DOCTYPE根标记的名称

PUBLIC"正式公用标识符""DTD文件的URI">例如:<!DOCTYPE商店营业时间PUBLIC"-//ISO123456/Daxian/ForXML/EN"“limitShop.dtd">PUBLIC关联表明所关联的DTD文件已经得到某一领域的认可,是经过许多人讨论得到认可的DTD文件。

18FPI正式公用标识符FPI的格式为:“-//ISO认证//单位名称//DTD说明//所用语言”

FPI中不可以含有非ASII码字符。

19DTD文件的位置SYSTEM和PUBLIC格式的文档类型声明中提到的:“DTD文件URI”DTD文件的URI必须是一个有效的资源,如果URI是一个文件的名字,该文件必须和当前XML文件在同一目录中;如果URI是一个链接,该链接地址必须是可访问的,使用URI可以使许多组织的XML文件共享同一个DTD文件。20example3_2.xml<?xmlversion=“1.0”encoding=“UTF-8”?><!DOCTYPE“商店营业时间”

SYSTEM“limtShop.dtd”><商店营业时间> <商店> <商店名称>国贸大厦</商店名称> <开门时间>08:30</开门时间> <关门时间>18:30</关门时间> </商店> <商店> <商店名称>华联商场</商店名称> <开门时间>07:30</开门时间> <关门时间>22:30</关门时间> </商店></商店营业时间>21现在看一个简单的DTD文件以及它是怎样约束XML文件的数据结构。假设编写一个关于学生的入学时间、毕业时间信息的XML文件,其中根标记是“学生”。<!ELEMENT学生(张三,李四)><!ELEMENT张三(入学时间,毕业时间)><!ELEMENT李四(入学时间,毕业时间)><!ELEMENT入学时间(#PCDATA)><!ELEMENT毕业时间(#PCDATA)>#PCDATA表示文本数据,可以含有普通字符、字符引用、实体引用或者是CDATA段的内容。22例子1dtdFile.dtd<!ELEMENT列车时刻表

(T28次,T226次)><!ELEMENTT28次

(开车时间,终到时间)><!ELEMENTT226次

(开车时间,终到时间)><!ELEMENT开车时间

(hour,minute)><!ELEMENT终到时间

(hour,minute)><!ELEMENThour(#PCDATA)><!ELEMENTminute(#PCDATA)>23Cha3_1.xml

<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE列车时刻表

PUBLIC"-//ISO88/China/xml/CH""dtdFile.dtd"><列车时刻表><T28次><开车时间><hour>23点</hour><minute>12分</minute></开车时间><终到时间><hour>23点</hour><minute>12分</minute></终到时间></T28次><T226次><开车时间><hour>08点</hour><minute>45分</minute></开车时间><终到时间><hour>19点</hour><minute>36分</minute></终到时间></T226次></列车时刻表>243.2怎样检查有效性

浏览器的XML解析器只检查XML文件是否是规范的。当用浏览器打开一个有效的XML文件时,浏览器的XML解析器仅仅检查XML文件所关联的DTD文件是否有语法错误,并不检查XML文件是否遵守该DTD规定的约束条件。 可以使用DOM解析器来检查一个XML文件是否是有效的。

25TestValidate.javaimportjavax.xml.parsers.*;importorg.xml.sax.helpers.*;importorg.xml.sax.*;importjava.io.*;importorg.w3c.dom.*;importjava.util.Scanner;publicclassTestValidate{publicstaticvoidmain(Stringargs[]){StringfileName=null;try{Scannerreader=newScanner(System.in);System.out.println("请输入要验证有效性的文件名字:");fileName=reader.nextLine();DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();

例子226 factory.setValidating(true);DocumentBuilderbuilder=factory.newDocumentBuilder();MyHandlerhandler=newMyHandler();builder.setErrorHandler(handler);Documentdocument=builder.parse(newFile(fileName));if(handler.errorMessage==null){System.out.println("XML文件是有效的");}else{System.out.println("XML文件不是有效的");}}catch(Exceptione){System.out.println(e);}}}27classMyHandlerextendsDefaultHandler{StringerrorMessage=null;publicvoiderror(SAXParseExceptione)throwsSAXException{errorMessage=e.getMessage();System.out.println("一般错误:"+errorMessage);}publicvoidfatalError(SAXParseExceptione)throwsSAXException{errorMessage=e.getMessage();System.out.println("致命错误:"+errorMessage);}}283.3DTD中的元素

DTD中的元素(ELEMENT)是用来约束XML文件中的标记,在DTD中使用元素声明来定义一个元素,元素的声明格式为:<!ELEMENT标记名称

标记的约束条件

>

例如:<!ELEMENT列车时刻表

(T28次,T29次)>

约束标记“列车时刻表”

只可以有且必须有两个子标记“T28次”和“T29次”。特别强调的2点:DTD文件中元素的作用与其在DTD文件中的书写位置无关。在DTD文件中不能使用多个元素约束同一个标记,即使它们的约束条件相同。293.3.1约束标记只包含文本数据如果约束一个标记没有子标记,也就是说约束标记只能包含文本数据。<!ELEMENT标记名称(#PCDATA)>下列3个标记符合要求:<姓名>张三</姓名><姓名></姓名><姓名/>30限制标记只有文本数据

关键字#PCDATA约束标记的文本数据中可以有:普通字符,CDATA段中的内容字符引用实体引用。 当一个标记使用这样的约束时,该标记的文本数据也可以只由一个“空字符”组成。31例如<!ELEMENTHello(#PCDATA)>下列“Hello”标记都是符合约束条件标记:<Hello>

你好</Hello><Hello>你好</Hello><Hello></Hello>而下列不符合约束条件:<Hello>

你好

<a>hello</a></Hello>323.3.2规定标记的子标记

如果想约束XML文件中某个标记可以有怎样的子标记,比如,标记必须有哪些子标记,子标记是否允许重复出现、出现的顺序如何等,那么

DTD中元素声明的“标记的约束条件”是用小括号括起的子标记列表,格式为<!ELEMENT标记名称

(子标记列表)>

333.3.2规定标记的子标记<!ELEMENT标记名称

(子标记列表)> XML文件中的标记可以含有文本数据和子标记,如果在DTD文件中使用上述约束条件的元素,这样的元素将约束XML文件中相应的标记只可以有子标记,不可以含有能显示的文本数据,即文本数据仅仅可以由空白类字符所组成。

“子标记列表”约束标记可以有哪些子标记及它们在父标记中出现的先后顺序。“子标记列表”是用逗号分隔列出的若干个标记,每个标记称做“子标记列表”的一个分项。34例如:<!ELEMENT开车时间

(hour,minute)>

要求标记“开车时间”

恰好有两个子标记“hour”和“minute”,不可以有能显示的文本数据,并且子标记在父标记“开车时间”中出现的顺序必须是“hour”、“minute”而不是

“minute”、“hour”.

35<开车时间> <hour> 04点

</hour> <minute> 58分

</minute></开车时间>不可以将T28标记写成<开车时间> <minute> 58分

</minute> <hour> 04点

</hour></开车时间>不可以将“开车时间”标记写成含有可显示文本“特快列车”<开车时间>

特快列车

<hour> 04点

</hour> <minute> 58分

</minute></开车时间>36子标记出现的次数

子标记列表中的每个子标记的后面可以尾加限定符号来限定该子标记出现的次数。不尾加限定符号的子标记必须出现且只能出现一次。限定符号有:+:尾加该限定符号的子标记必须出现一次或多次。*:尾加该限定符号的子标记可出现零次或多次。?:尾加该限定符号的子标记可出现零次或一次。例如:<!ELEMENT库存商品(商品名称+,管理员?)>37分项的或运算子标记列表的分项也可以是几个标记的“或运算”,而且或运算必须用小括号括起来。例如:<!ELEMENT应聘者(姓名,(本科|硕士|博士),(男|女))><!ELEMENT应聘者(姓名,(奖励|处分)*,(男|女))>38例子3dtdFile.dtd<!ELEMENT应聘信息(应聘者*)><!ELEMENT应聘者(姓名,(本科|硕士|博士),(奖励|处分)*,(性别))><!ELEMENT本科(#PCDATA)><!ELEMENT硕士(#PCDATA)><!ELEMENT博士(#PCDATA)><!ELEMENT奖励(#PCDATA)><!ELEMENT处分(#PCDATA)><!ELEMENT性别(#PCDATA)><!ELEMENT姓名(#PCDATA)>39Cha3_3.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE应聘信息SYSTEM"dtdFile.dtd"><应聘信息><应聘者><姓名>张林将</姓名><硕士>北京大学计算机理学硕士</硕士><奖励>获2005年度光华奖学金</奖励><奖励>获2003年度一等奖学金</奖励><处分>2004被一次警告处分</处分><性别>男</性别></应聘者><应聘者><姓名>李小黎</姓名><博士>清华大学自动化专业工学博士</博士><奖励>获2003年度光华奖学金</奖励><性别>女</性别></应聘者><应聘者><姓名>王劲劲</姓名><本科>南京大学文学系文学学士</本科><性别>女</性别></应聘者></应聘信息>403.规定标记的混合内容

一个标记的内容可以有两部分构成:文本数据和标记,其中的标记称做该标记的子标记。 格式如下:<!ELEMENT标记名称

(#PCDATA|子标记1|子标记2…|子标记m)*>

41错误的写法(#PCDATA|子标记1|子标记2…|子标记m)其错误是未用“*”字符结尾;(#PCDATA|子标记1|子标记2…|子标记m)+其错误是使用“+”字符结尾;(#PCDATA|子标记1|子标记2…|子标记m)?其错误是使用“?”字符结尾;(#PCDATA,子标记1,子标记2…,子标记m)子标记列表不能有“#PCDATA”分项。

约束标记的混合内容元素的缺点是:只能约束该标记可以有哪些子标记,不能约束这些子标记出现的次数和出现的顺序。另外,约束条件中也不能使用限制符号,下列写法是错误的。(#PCDATA|子标记1+|子标记2*…|子标记m?)42fiveDTD.dtd<!ELEMENT学生列表(姓名*)><!ELEMENT姓名(#PCDATA|出生日期|性别)*><!ELEMENT出生日期(#PCDATA)><!ELEMENT性别(#PCDATA)>43<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE学生列表PUBLIC"-//ISO88//school//ForXML//Ch"“fiveDTD.dtd"><学生列表><姓名>张三

<出生日期>1993-12-12</出生日期><性别>男</性别></姓名><姓名>孙翠花

<出生日期>1992-01-31</出生日期><性别>女</性别></姓名></学生列表>44例子4dtdFile.dtd<!ELEMENT列车时刻表(车次)*><!ELEMENT车次(#PCDATA|开车时间|终到时间)*><!ELEMENT开车时间(#PCDATA)><!ELEMENT终到时间(#PCDATA)>45Cha3_4.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE列车时刻表PUBLIC"-//ISO88//raiway//ForXML//Ch""dtdFile.dtd"><列车时刻表><车次>K83次特快列车

<开车时间>20点36分</开车时间> <开车时间>20点36分</开车时间> <开车时间>16点36分</开车时间><终到时间>07点12分</终到时间></车次><车次><终到时间>09点16分</终到时间> K18次特快列车

</车次><车次><终到时间>09点16分</终到时间> K18次特快列车

<开车时间>16点36分</开车时间></车次><车次></车次></列车时刻表>464.

EMPTY和ANY

如果准备约束一个标记是空标记,或者是只含有空字符的非空标记,元素的“标记的约束条件”可以是关键字“EMPTY”;<!ELEMENTspeakEMPTY> 如果不准备对一个标记有任何约束,元素的“标记的约束条件”可以是关键字“ANY”。例如:<!ELEMENThelloANY>47<!ELEMENTspeakEMPTY>下列标记都是符合约束条件的标记<speak/><speak></speak><hello>qweqwe</hello><!ELEMENThelloANY>而下列标记都是不符合约束条件的标记<speak>Howareyou</speak><speak></speak><speak></speak>48493.4DTD的完整性

一个DTD文件必须是完整的,即满足:(1)不允许无穷嵌套如果一个DTD元素约束某个标记可以出现某个子标记,那么对该子标记进行约束的DTD元素就不能约束该标记的子标记是它的父标记。下列是错误的。<!ELEMENT商品名称(name,price)><!ELEMENTprice(商品名称,unit)><!ELEMENT学生(姓名,性别)><!ELEMENT姓名(学生,拼音)>3.4DTD的完整性

(2)XML文件中的每个标记都必须在DTD中有相应元素进行约束。下列DTD文件是不完整的。<!ELEMENT列车时刻表(T28次,T29次)><!ELEMENTT28次(hour,minute)><!ELEMENTT29次(minute,hour)><!ELEMENT商店营业时间(商店*)><!ELEMENT商店(商店名称,开门时间,关门时间)><!ELEMENT商店名称(#PCDATA)>50513.5DTD中的属性约束列表

属性是指标记的属性,可以为标记添加附加信息。属性是一个名值对,即属性必须由名字和值组成。属性必须在非空标记的开始标记或空标记中声明,用“=”为属性指定一个值。例如,我们可为标记“桌子”添加三个属性:<桌子width=“300”height=“600”length=“1000”>

一个信息是否作为一个标记的附加信息或作为该标记的子标记,这取决于具体的问题。一个基本的原则:不要因为属性的频繁使用而破坏稳当的结构。523.5.1ATTLIST属性约束列表 DTD中的属性列表(ATTLIST)可用来约束XML文件中标记的属性,在DTD中属性列表的声明格式为:<!ATTLIST标记名称

属性名称

属性类型

默认值情况属性名称

属性类型

默认值情况…

…>例如:<!ATTLIST桌子

widthCDATA“0” heightCDATA“0” lengthCDATA“0”>注意:对于有效的XML文件,对于标记中添加的每个属性,在DTD中都必须有相应的ATTLIST声明给予约束。例6sixDTD.dtd<!ELEMENT教学楼(教室*)><!ELEMENT教室(号码,用途)><!ELEMENT号码(#PCDATA)><!ELEMENT用途(#PCDATA)><!ATTLIST教室widthCDATA“8m”><!ATTLIST教室lengthCDATA“15m”>53example3-6.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE教学楼SYSTEM"sixDTD.dtd"><教学楼><教室><号码>A101</号码><用途>自习室</用途></教室><教室width=“10m”length=“16m”><号码>A606</号码><用途>语音室</用途></教室></教学楼>

浏览器的解析器认为它有名字为width和length的属性,且属性值是DTD文件中属性列表约束给出的默认值。5455属性名称”、“属性类型”和“默认值情况”

在ATTLIST声明中,涉及到“属性名称”“属性类型”和“默认值情况”,其意义分别阐述如下:<!ATTLIST标记名称属性名称属性类型默认值情况>(1)属性名称属性名称的命名规则和标记的命名规则相同,可以由字母、数字、下划线(“_”)、点(“.”)或连字符(“-”)组成,但必须以字母或下划线开头。属性的名称区分大小写。(2)属性类型

我们已经知道属性值一定是一个字符串,那么属性类型就决定了属性可以用怎样的字符串作为属性的值。无论何种类型的属性,其属性值中都不能含有左尖括号,右尖括号,与符号,单引号和双引号。如果想用这些值,可以使用实体引用。属性值区分大小写。(3)默认值情况

ATTLIST声明中关于属性的“默认值情况”是对XML文件中标记的属性进行约束的细节条件。562.属性的默认值 <!ATTLIST>声明中包括“属性名称”、“属性类型”和“默认值情况”,其中的“默认值情况”含有约束的细节条件。

“默认值情况”对标记中的属性的约束意义的表述。

默认值情况约束意义字符串标记必须有该属性,且有默认值#IMPLIED标记可以没有该属性,没有默认值#REQUIRED标记必须有该属性,没有默认值#FIXED“字符串”标记可以没有该属性,但如果有该属性,那么属性值固定不变57以下就“默认值情况”的几种情况详细讨论如下

(1)字符串如果某个属性的“默认值情况”是一个字符串,

XML中对应标记必须有该属性,但标记可以不明显地添加该属性。如果不明显地添加该属性,解析器也认为该标记有这个属性,并且默认值为DTD文件中ATTLIST声明给定的字符串。<!ATTLIST张山heightCDATA"160"><!ATTLIST桌子colorCDATA"red">

58举例5dtdFile.dtd<!ELEMENTroom(桌子)*><!ELEMENT桌子(#PCDATA)><!ATTLIST桌子

widthCDATA"100"heightCDATA"100"lengthCDATA"100">Cha3_5.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEroomSYSTEM"dtdFile.dtd"><room><桌子width="123"height="200"length="5555">

红桌子

</桌子><桌子>

大小如何?

</桌子></room>举例7sevenDTD.dtd<!ELEMENT商品列表(商品*)><!ELEMENT商品(名称,价格)><!ELEMENT名称(#PCDATA)><!ELEMENT价格(#PCDATA)><!ATTLIST商品类别CDATA"食品">example3_7.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE商品列表SYSTEM"sevenDTD.dtd"><商品列表><商品

类别=“家电"> <名称>电视机</名称><价格>2678元/台</价格>

</商品><商品> <名称>东北大米</名称><价格>5.9元/斤</价格>

</商品></商品列表>

5960(2)#IMPLIED

当属性的“默认值情况”是关键字“#IMPLIED”时,该属性就没有默认值,而且相应的标记里可以不使用该属性。当认为一个属性可有可无,且没有默认值时,就可以将属性的“默认值情况”设置为“#IMPLIED”。

<!ATTLIST顾客heightCDATA#IMPLIED>61(3)#REQUIRED当属性的“默认值情况”是关键字“#REQUIRED”时,该属性没有默认值,相应的标记必须要添加该属性并给出属性的值。

当我们不想为某个属性设置默认值,但要求标记里必须有该属性时,就可以将属性的“默认值情况”设置为“#REQUIRED”。<!ATTLIST顾客

heightCDATA#REQUIRED>62(4)#FIXED

当属性的“默认值情况”是关键字“#FIXED”和一个字符串时,该属性的默认值就是关键字“#FIXED”后面指定的那个字符串。

在编写XML文件时,即使被约束的标记不显示的附加该属性,解析器也认为该标记有这个属性,而且属性值是关键字“#FIXED”

指定的字符串。但如果标记显示添加该属性,那么不可以改变属性的值,即该属性的值必须是关键字“#FIXED”

指定的字符串。<!ATTLIST消防车

颜色

CDATA#FIXED"红色"><!ATTLIST报警电话号码CDATA#FIXED“110">

63

目前,浏览器内置的XML解析器只检查XML关联的DTD文件本身是否有错,但不检查XML文件是否遵守了DTD文件的约束条件。

如果你只想检查有效性,也可以使用3.2节中的解析器。例8eightDTD.dtd<!ELEMENT教学楼(教室*,休息室*)><!ELEMENT教室(#PCDATA)><!ELEMENT休息室(#PCDATA)><!ATTLIST教室号码CDATA#REQUIRED><!ATTLIST休息室号码CDATA#IMPLIED>example3_8.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE教学楼SYSTEM"sevenDTD.dtd"><教学楼><教室号码=“2109”

>物理系专用</教室><教室号码=“5509”>英语系专用</教室><休息室号码=“T5”>老师课间休息专用</休息室><休息室>学生课间休息专用</休息室></教学楼>64例9nineDTD.dtd<!ELEMENT重要电话簿(报警电话,火警电话,急救电话)><!ELEMENT报警电话(#PCDATA)><!ELEMENT火警电话(#PCDATA)><!ELEMENT急救电话(#PCDATA)><!ATTLIST报警电话号码CDATA#FIXED“110”><!ATTLIST火警电话号码CDATA#FIXED“119”><!ATTLIST急救电话号码CDATA#FIXED“120”>6566例子6dtdFile.dtd<!ELEMENT车(汽车*,驴车*)><!ELEMENT汽车(#PCDATA)><!ATTLIST汽车车牌CDATA#REQUIRED><!ELEMENT驴车(#PCDATA)><!ATTLIST驴车车牌CDATA#IMPLIED>Cha3_6.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE车SYSTEM"dtdFile.dtd"><车><汽车车牌="汽A1234567">

交通工具

</汽车><驴车车牌="驴A7654321">

农用车

</驴车></车>67TestAttsOne.javaimportjavax.xml.parsers.*;importorg.xml.sax.helpers.*;importorg.xml.sax.*;importjava.io.*;publicclassTestAttsOne{publicstaticvoidmain(Stringargs[]){try{SAXParserFactoryfactory=SAXParserFactory.newInstance();factory.setValidating(true);factory.setNamespaceAware(true);SAXParsersaxParser=factory.newSAXParser();MyHandlerOnehandler=newMyHandlerOne();saxParser.parse(newFile("cha3_6.xml"),handler);}catch(Exceptione){System.out.println(e);}}}68classMyHandlerOneextendsDefaultHandler{publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesatts){System.out.print("<"+localName+">");System.out.println("该标记的属性:");for(intk=0;k<atts.getLength();k++){System.out.print("属性名称:");System.out.print(atts.getLocalName(k)+"");System.out.print("属性类型:");System.out.print(atts.getType(k)+"");System.out.print("属性的值:");System.out.print(atts.getValue(k)+"");}}publicvoidendElement(Stringuri,StringlocalName,StringqName){System.out.println("</"+localName+">");}publicvoiderror(SAXParseExceptione)throwsSAXException{StringerrorMessage=e.getMessage();System.out.println("一般错误:"+errorMessage);}}69例子7dtdFile.dtd<!ELEMENT电话薄(报警电话,火警电话)><!ELEMENT报警电话(#PCDATA)><!ATTLIST报警电话号码CDATA#FIXED"110"><!ELEMENT火警电话(#PCDATA)><!ATTLIST火警电话号码CDATA#FIXED"119">Cha3_7.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE电话薄SYSTEM"dtdFile.dtd"><电话薄><报警电话号码="110">

不要乱打报警电话。

</报警电话><火警电话号码="119">

一旦发生火灾,请及时拨打119。

</火警电话></电话薄>70TestAttsTwo.javaimportjavax.xml.parsers.*;importorg.xml.sax.helpers.*;importorg.xml.sax.*;importjava.io.*;importorg.w3c.dom.*;publicclassTestAttsTwo{publicstaticvoidmain(Stringargs[]){OutContentoutContent=newOutContent();try{DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();factory.setValidating(true);DocumentBuilderbuilder=factory.newDocumentBuilder();builder.setErrorHandler(newMyHandlerTwo());Documentdocument=builder.parse(newFile("cha3_7.xml"));Elementroot=document.getDocumentElement();StringrootName=root.getNodeName();System.out.println("XML文件根节点的名字:"+rootName);NodeListnodeList=root.getChildNodes();outContent.output(nodeList);}catch(Exceptione){System.out.println(e);}}}71classOutContent{publicvoidoutput(NodeListnodeList){intsize=nodeList.getLength();for(intk=0;k<size;k++){Nodenode=nodeList.item(k);if(node.getNodeType()==Node.ELEMENT_NODE){ElementelementNode=(Element)node;Stringname=elementNode.getNodeName();System.out.print(name); //获取标记的全部属性

NamedNodeMapmap=elementNode.getAttributes(); for(intj=0;j<map.getLength();j++){AttrattrNode=(Attr)map.item(j);StringattName=attrNode.getName();StringattValue=attrNode.getValue();System.out.println("属性名称及值:"+attName+"="+attValue);}NodeListnodes=elementNode.getChildNodes();output(nodes);}}}}72classMyHandlerTwoextendsDefaultHandler{publicvoiderror(SAXParseExceptione)throwsSAXException{StringerrorMessage=e.getMessage();System.out.println("一般错误:"+errorMessage);}}733.属性类型

属性类型决定了属性可以用怎样的字符串作为属性的值。属性的常用类型有:CDATAEnumeratedNMTOKENNMTOKENSIDIDREFIDREFS以下分别来介绍这些属性类型。74(1)CDATA类型

对于CDATA(CharacterData)类型的属性,该属性的值可以是任何一个字符串,但是,字符串中不能含有左尖括号、右尖括号、与符号、单引号和双引号,如果想使用这些字符,可以使用字符引用或实体引用。 下面的例子10说明了CDATA类型属性的用法。可用例子2中的解析器验证XML文件是否有效。75例子10tenDTD.dtd<!ELEMENT通讯录(姓名*)><!ELEMENT姓名(#PCDATA)><!ATTLIST姓名电话CDATA#REQUIREDEmailCDATA#REQUIRED

住址CDATA#IMPLIED>example3_10.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE通讯录SYSTEM"tenDTD.dtd"><通讯录><姓名电话="12345678"Email=“zhangfei@">

张飞

</姓名><姓名电话=“98765432"Email=“likui@"住址="北京海淀区">

李奎

</姓名></通讯录>76(2)Enumerated类型

如果属性的类型是Enumerated类型,那么该属性只可以取枚举出的值。Enumerated不是关键字,是指类型定义的格式,其格式是将属性可以取的值用符号“|”分隔,Enumerated类型的定义格式如下:<!ATTLIST标记名称

属性名称

(属性值1|属性值2|…|属性值n)

默认值情况>

对于Enumerated类型,属性值可以由字母、数字、下划线、点或连字符组成,并允许首字符是数字字符。77例子9dtdFile.dtd<!ELEMENT学生(姓名*)><!ELEMENT姓名(#PCDATA)><!ATTLIST姓名性别(1男|女)#REQUIRED>Cha3_9.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE学生SYSTEM"dtdFile.dtd"><学生><姓名性别=“1男">

张三

</姓名><姓名性别="女">

翠花

</姓名></学生>例11elevenDTD.dtd<!ELEMENT道路(路灯*)><!ELEMENT路灯(编号,位置)><!ELEMENT位置(#PCDATA)><!ELEMENT编号(#PCDATA)><!ATTLIST路灯状态(亮|灭)#REQUIRED>example3_11.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE道路SYSTEM“elevenDTD.dtd"><道路><路灯状态=“亮”><编号>10010</编号><位置>中山路</位置>

</路灯><路灯状态=“灭"><编号>20011</编号><位置>长江路</位置>

</路灯></道路>7879(3)NMTOKEN类型

如果属性的类型是NMTOKEN类型的属性,属性值可以由字母、数字、下划线(“_”)、点(“.”)或连字符(“-”)组成,属性值中不能含有空格字符(属性值也可以用数字、点或连字符开头)。dtdFile.dtd<!ELEMENT文件(Java文件,XML文件)><!ELEMENTJava文件(#PCDATA)><!ATTLISTJava文件文件名NMTOKEN#REQUIRED><!ELEMENTXML文件(#PCDATA)><!ATTLISTXML文件文件名NMTOKEN#REQUIRED>80Cha3_10.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE文件SYSTEM"dtdFile.dtd"><文件><Java文件文件名="Hello.java">

<![CDATA[classHello{publicstaticvoidmain(Stringargs[]){System.out.println("ok");}}]]></Java文件><XML文件文件名="First.xml">

<![CDATA[<?xmlversion="1.0"?><职员><姓名>张小三</姓名></职员>]]></XML文件></文件>例子10例12twelveDTD.dtd<!ELEMENT作家名单(姓名*)><!ELEMENT姓名(#PCDATA)><!ATTLIST姓名笔名NMTOKEN#IMPLIED>example3_12.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE作家名单SYSTEM"twelveDTD.dtd"><作家名单><姓名笔名=“仙山”>

张三

</姓名><姓名笔名=“桃李">

李陶</姓名></作家名单>8182(4)NMTOKENS类型

我们已经知道,对于NMTOKEN类型的属性,其属性值中不能含有空白类字符。如果需要某个属性的属性值含有空白类字符,而且被空白分隔开的子字符串符合NMTOKEN类型属性的属性值之规定,那么就可以将属性的类型取为NMTOKENS类型。

83例子11dtdFile.dtd<!ELEMENT成果(论文*)><!ELEMENT论文(#PCDATA)><!ATTLIST论文关键字NMTOKENS#REQUIRED>Cha3_11.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE成果SYSTEM"dtdFile.dtd"><成果><论文关键字="拓扑熵混沌映射">

本论文详细讨论了线段自映射的拓扑熵和Li-yorke混沌之间的关系

</论文><论文关键字="XMLSOAP">

本论文详细讨论了基于SOAP通信中XML文件的作用。

</论文></成果>例13thirteenDTD.dtd<!ELEMENT图书列表(图书*)><!ELEMENT图书(名称,出版社)><!ELEMENT名称(#PCDATA)><!ELEMENT出版社(#PCDATA)><!ATTLIST图书关键字NMTOKENS#REQUIRED>example3_13.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE图书列表SYSTEM"thirteenDTD.dtd"><图书列表><图书关键字=“XML可扩展语言解析器"><名称>XML基础教程</名称><出版社>清华大学出版社</出版社>

</图书><图书关键字=“JAVA类对象线程"> <名称>Java程序设计</名称><出版社>清华大学出版社</出版社>

</图书></图书列表>8485(5)ID类型 ID类型的属性的属性值具有互斥性,即所有ID类型的属性的属性值必须互不相同。如果希望某个属性的属性值具有专用性,即不允许其他类型相同(ID类型)的属性再使用这个属性值,那么就可以将属性的类型取为ID类型。

需要注意的是,ID类型的属性值可以由字母、数字、下划线、点或连字符组成,但必须以字母或下划线开头。

需要特别注意的是ID类型属性的默认值情况只能是“#REQUIRED”和“#IMPLIED”,不可以是“字符串”或#FIXED“字符串”。

一个标记的若干属性中不允许有2个属性的类型都是ID。86例如,下列ID类型属性的“默认值情况”是错误的。<!ATTLIST张山址址ID#FIXED“北京大学”><!ATTLIST张山地址ID“北京大学”><!ATTLIST汪想地址IDFIXED“北京市”><!ATTLIST辛望地址ID“清华大学”>下列ID类型属性的“默认值情况”是正确的。

<!ATTLIST张山地址ID#REQUIRED> <!ATTLIST张山地址ID#IMPLIED><!ATTLIST汪想地址ID#REQUIRED><!ATTLIST辛望地址ID#IMPLIED>87例子12dtdFile.dtd<!ELEMENT出版社(图书*)><!ELEMENT图书(名称*)><!ELEMENT名称(#PCDATA)><!ATTLIST名称ISBNID#REQUIRED>Cha3_12.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE出版社SYSTEM"dtdFile.dtd"><出版社><图书><名称ISBN="ISBN.7-302-09142-0">Java基础教程

</名称>

<!--下面的ISBN属性的取值是不允许的--><名称ISBN="ISBN.7-302-09142-0">JSP基础教程

</名称></图书></出版社>ID类型的属性值的专用性仅限于ID类型的属性,并不干涉其他类型属性的属性值。例14fourteenDTD.dtd<!ELEMENT城市交通(公交电车,公交汽车)><!ELEMENT公交电车(名称*)><!ELEMENT公交汽车(名称*)><!ELEMENT名称(#PCDATA)><!ATTLIST名称车牌号ID#REQUIRED>example3_14.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE城市交通SYSTEM"fourteenDTD.dtd“><城市交通><公交电车><名称车牌号=“辽B555”>101无轨电车<名称><名称车牌号=“辽B555”>201有轨电车<名称></公交电车><公交汽车><名称车牌号=“辽B666”>801快车<名称><名称车牌号

温馨提示

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

评论

0/150

提交评论