XMLXMLXMLXML基础、使用JAXPJAXPJAXPJAXP与Dom4jDom4jDom4jDom4j操作xmlxmlxmlxml文件、Dom4jDom4jDom4jDom4j项目演示作者:吕鹏时间:2011-07-212011-07-212011-07-212011-07-21一、XMLXMLXMLXML基础1.1.1.1.xmlxmlxmlxml的语法规则·文档声明?xmlversion=“1.0”??xmlvesion=“1.0”encoding=“UTF-8”?表示文档声明:?号是xml语言的指令,后面跟xml说明是xml语言。version是xml语言的版本号,目前只能是1.0.encoding是编码格式,强烈建议使用utf-8.可选的值为GBK,GB2312·自定义元素。users/xml的元素必须成对出现,有开始就必须有结束,缺一不可,否则出错。nameTom/name-成对出现的标签。name/-开始和结束在一个标签体内的标签。一个xml文档,只能有一个根元素标签。其他标签都应该是它的子元素。·元素的命名规范可以是字母、数字(不能是开头)、下划线。区分大小写。不能使用?、:(冒号)。不能包含空格。·属性username=“tom”age=“33”/username=“tom”age=“99”/值两边必须使用””(双引号)。用属性描述的值可以转成用子元素来描述usernameTom/nameage99/age/user·注释!----·CDATA区-即原意文本-![CDATA[…]]!--这儿写注释--注释不能嵌套。![CDATA[在此输入不想让程序解释的内容]]·xml使用场合XML文件,经常用在一个软件系统中,以提高软件的灵活性。一个软件在启动时所加载的模块或是使用语言,经常是在xml文件中进行配置的。典型的Tomcat服务器,就用了大量的xml文件配置其服务信息。2.2.2.2.xmlxmlxmlxml文档的约束·XML约束是定义XML中可以写什么,不可以写什么的约定。超出XML约束的范围,或是遗漏XML必须的元素将会导致编译不通过。目前有两种约束技术:(1)DTD–DocumentTypeDefinition-文档类型定义以DTD为文件扩展名的文档,使用DOCTYPE引入(2)XMLSchema–xsd以xsd为扩展名的文档,使用命名空间。·使用js来验证xml文档的正确性建立一个html文件。因为IE内置了XML的解析工具:Microsoft.XMLDOM,利用这个解析工具,对xml进行dtd的验证。1、创建对像varxml=newActiveXObject(“Microsoft.XMLDOM”);2、装载数据xml.load(“some.xml”);3、打开验证功能xml.validateOnParse=true;4、输出消息xml.parseError.reason;//原因xml.parseError.line;//错误的行号5、使用Eclipse可以直接验证XML的正确性。·使用DTD约束-2使用本地外部的DTD文档。语法:!DOCTYPE根节点名称SYSTEM“DTD文件名”SYSTEM–说明验证文档是来自于本地,后面跟DTD文档的地址信息。示例:!DOCTYPErootSYSTEM“some.dtd”3.3.3.3.DTDDTDDTDDTD详解(1111)DTDDTDDTDDTD语法·使用ELEMENT(必须大写)来声明一个元素:!ELEMENT元素名称元素类型·元素类型可以包含以下内容:EMPTY–空,不允许出现任何内容。示例:!ELEMENTnameEMPTY则nameTom/name是错误的ANY–任意,可以出现任何类型,但不可以出现未定义的元素。如:!ELEMENTnameANY则:name/,nameTom/name,namenameTom/name/name自己包含自己,都是正确的。如:〈!ELEMENTroot(user),是指:root元素内只可以出现一个user元素,必须出现,且只能有一个。·(逗号)表示出现的顺序必须与声明的一致如!ELEMENTuser(name,age),则name和必须出现在user内,且name必须在前,age必须在后。·|(竖线)表示多个只可以出现一个如:!ELEMENTuser(phone|tel|call),则在user内部只能出现phone或tel或call.决不能同时出现。·在元素定义时可以使用+,?,*,来表示出现的次数什么也没有表示只能而且必须出现一次。如:(name,age)+表示可以出现1次或多次,至少一次。如:(address+)?表示可以出现0次或1次,最多一次。如:(grilFriend?)*表示可以出现0次或多次。如:(child*)·也可以批量设置如!ELEMENTuser(name|age)*,是指:name或age可以出现也可以不出现,而且可以不按顺序出现。(2222)DTDDTDDTDDTD之使用attlistattlistattlistattlist定义属性·在DTD文档中,可以通过ATTLIST定义某个元素的属性。·语法为:可以一次设置多个属性:!ATTLIST元素名称属性1值类型设置说明属性2值类型设置说明…如:!ATTLISTnameidID#REQUIREDfnameCDATA#REQUIREDlnameCDATA#REQUIRED意思是:name元素拥有一个三个必须的属性,分别为id,fname,lname。它的xml为:nameid=“a001”fname=“M”lname=“Jack”/·规则:!ATTLIST元素名称属性1值类型设置说明·值类型说明:定义了属性的取值范围。如:ID–表示为唯一值,不能与其他ID值相同如!ATTLISTuseridID#REQUIRED说明user元素有一个id属性且取值为ID即在xml文件中与其他id不能重复。同时id必须符合变量的命名规范,即不能以数字开头。CDATA–表示值为一行字符串。如:!ATTLISTusercountryCDATA#IMPLIED枚举ENUM:!ATTLISTusercity(Beijing|ShanDong|ShangHai)#REQUIRED,是指city属性只能从三个可选项中选择一下,具必须拥有此属性。再如:!ATTLISTusercity(BeiJing|ShangHai)“BeiJing”拥有默认值。·规则:!ATTLIST元素名称属性1值类型设置说明#REQUIRED–必需设置的属性。#IMPLIED–可以设置也可以不设置。#FIXED–固定取值的属性。不可以修改-后面必须添加设置值。示例:!ATTLISTnamecountryCDATA#REQUIRED,name元素拥有一个country属性,且是必须输入的。!ATTLISTusercountryCDATA#FIXED“China”,user元素拥有一个country属性,它的默认值为China。(3333)ENTITYENTITYENTITYENTITY——引用实体////参数实体·所谓实体,是指在DTD当中定义的一个变量。·引用实体:引用实体是给xml文件使用的。定义:!ENTITY变量名“变量值”在XML中引用的方式:&变量名;注意前面是&符号,后面是;(分号)。示例:!ENTITYcopyRight“”在xml中引用:node©Right;/node或在属性当中引用:nodefiled=“©Right;”/·参数实体:参数实体是给DTD文件使用的。定义:!ENTITY%变量名“变量值”-注意之间的空格。示例:!ENTITY%tt“user|name”在DTD中引用:!ELEMENTroot(%tt;)*-不使用“”双引号,必须在括号内学习建议:1、对DTDDTDDTDDTD文档的要求,只要能看懂即可。2、目前很多的IDEIDEIDEIDE都支持对XMLXMLXMLXML文档的自动验证,没有必要在这上面浪费时间。3、建议大家使用EclipseEclipseEclipseEclipse开发XMLXMLXMLXML文档,它支持自动的编码保存,如果引用了DTDTDTDTDDDD文档它也提供自动的验证功能。二、使用JAXPJAXPJAXPJAXP操作xmlxmlxmlxml文件1.1.1.1.关键词解释·DOM-DocumentObjectModel-文档对像模型。是w3c组织处理xml的一种方式。·特点:一次将所有数据全部加载到内存中。对xml文档中的每一个节点都当成一个对像Node处理。包括元素、文本、属性。见javaApi-org.w3c.dom包中的Document,Element,Node。非常方便进行修改。已经集成在了JDK中,是Sun对xml操作的标准。缺点是当文档数据量很大时,对内存有占用很大。·Sax–SampleApiforXML(没有人用这东西)。在读取数据时分析数据,通过事件监听器来完成。速度快但只适合查找数据,且是一次性的。虽然速度很快,但它并不适合多次对同一个文档反复操作。用户不是很多。也已经集成到了JDK当中。·JAXP(JavaApiforXmlProgramming)–sun公司的一套操作XML的API.DOM解析-一次性的将数据全部装入内存。SAX解析-边读取边解析。·Dom4j(DocumentForJava)-第三方开源,是从jdom分裂出来的解析技术。(目前jdom已经完全被dom4j替代。)Dom4j在性能和速度上都比sun公司的要快,而且支持Xpath快速查找,目前像Spring,Hibernate这些大型的框架,都是用的dom4j.·两者都支持从无到有创建全新的文档。2.2.2.2.JAXPJAXPJAXPJAXP(1111)必备知识(包与示例)·包:(要求前三个必须记住----最好记到自己的本子上)javax.xml.parsejavax.xml.parsejavax.xml.parsejavax.xml.parse–关键类DocumentBuilderDocumentBuilderDocumentBuilderDocumentBuilder,文档解析对像。org.w3c.domorg.w3c.domorg.w3c.domorg.w3c.dom–关键类DocumentDocumentDocumentDocument代表内存中的文档对像模型。java.xmljava.xmljava.xmljava.xml–关键类Transformer,Transformer,Transformer,Transformer,用于将内存中的文档保存到文件中。org.xml.sax.–关键类XMLReader,一次性读取XML文档,属性sax。如何获取一个Document文档?DocumentBuilderFactory-类-用此类获取dom文档的解析器。DocumentBuilder–dom文档的解析器。·示例:1、通过静态工厂方法获取DocumentBuilderFactory-文档创建工厂DocumentBuilderFactoryDocumentBuilderFactoryDocumentBuilderFactoryDocumentBuilderFactorydbfdbfdbfdbf====DocumentBuilderFactory.newInstance();DocumentBuilderFactory.newInstance();DocumentBuilderFactory.newInstance();DocumentBuilderFactory.newIn