您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第8章《使用 JAVA 语言对 XML 数据进行解析》
8.使用Java语言对XML数据进行解析Java语言和XML数据格式都被认为是过去数十年中最为重要的IT技术之一。Java为编程提供了一种与平台无关的语言,从而导致了程序开发领域的一场革命。XML为数据交换提供了一种与平台无关的表现形式,从而使得这场革命更加激烈、更加彻底。Java和XML之间存在有许多相似的特性,比如平台无关性、可扩展性、可重用性和国际化支持。XML和Java常常被认为是完美的组合,使用XML的半结构化模型描述各种各样的业务数据、表达复杂的业务信息,后台则使用Java语言来实现独立于平台的、易于处理的面向对象的应用软件解决方案。用于XML数据处理的JavaAPIIBM、Apache以及其他许多公司,开发了很多用于XML数据处理的JavaAPI。从JDK1.4开始,Sun公司将一些非常重要的代码库集成到了Java2平台之中,并不断升级更新,直到JDK1.6。在尚未发布的Java7中,Sun公司努力实现对XML的语言级支持。对于其它的语言也同样如此(比如C++、Perl、.NET),作为一名程序开发人员,需要在首先了解XML相关技术的基础上,熟练掌握有关XML数据处理的程序开发技巧,才能顺利完成开发任务。JDK1.6中面向XML的JAVAAPI用于XML数据处理的JAVAAPI(JavaAPIforXMLProcessing,JAXP)。JAXP对应于JDK中的javax.xml包及其部分子包、org.w3c.dom包及其子包、org.xml.sax包及其子包;用于XML数据绑定的JavaAPI(JavaAPIforXMLBinding,JAXB),对应于JDK中的javax.xml.bind包及其子包;用于基于XML的RPC的JavaAPI(JavaAPIforXML-basedRPC,JAX-RPC),对应于JDK中的javax.jws包及其子包;用于带附件的SOAP消息的JAVAAPI(SOAPwithAttachmentsAPIforJava,SAAJ),对应于JDK中的javax.xml.soap包及其子包;用于基于XML的Web服务的JavaAPI(JavaAPIforXML-basedWebservices,JAX-WS),对应于JDK中的javax.xml.ws包及其子包;用于XML加密签名的JavaAPI,对应于JDK中的javax.xml.crypto包及其子包;8.1XML数据解析的概念及JAXP简介XML解析器实际上就是能够识别XML基本语法形式的特殊应用程序,并将纯文本的XML文档转换成其他某种内存中表现形式(比如XML文档树、或者一系列的解析事件),以便客户端应用程序能够方便地对XML文档中的数据进行访问、提取、检索。Xerces来自IBM在1999年捐赠给Apache的XML4J项目,随后成为了ApacheXMLProject的子项目。但由于XML技术的迅速发展,在2004年,Xerces解析器成为了ApacheSoftwareFoundation的顶级项目(独立项目)。DOM和SAX解析模型简介DOM(DocumentObjectModel)是W3C的规范(),是一种与浏览器、平台、语言无关的接口,可用于表示各种半结构化的、层次模型的数据(比如HTML、XML等)。SAX(SimpleAPIforXML)是顺序读取XML的解析器API,是一个为基于事件XML解析器定义的、免费的、并且与平台、语言无关的API。由XML-Dev邮件列表组织(由许多XML方面的专家和开发人员组成)开发而来,并且已经成为了一种XML数据处理的事实上的标准。DOM解析模型DOM是以层次结构组织的节点或信息片断的集合,是XML数据的一种树型表示,通过树中的各种节点、以及节点之间的父子关系来表示XML文档中的元素、属性、文本内容,以及元素之间的嵌套关系。这个层次结构允许开发人员在树中寻找特定信息,并对其中的数据进行修改和创建。SAX解析模型SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件(如图8-2中所示),当发生相应事件时,将调用一个回调方法,回调方法的编写是数据解析的关键。?xmlversion=1.0?configserverUNIX/server/configStartdocumentStartelement(config)Characters(whitespace)Startelement(server)Characters(UNIX)Endelement(server)Characters(whitespace)Endelement(config)EnddocumentJAXP简介JAXP是JavaAPIforXMLProcessing的首字母缩写(读作jaks-p),是SUNJavaJDK中的XML编程API,它为解析、处理、验证XML文档数据的基本功能提供了相应的编程接口。作为处理XML数据的Java抽象层,JAXP规范本身也在不断地发展,目前JDK1.6中的JAXP的版本为JAXP1.4。JAXP的本质XML解析器种类繁多,开发人员希望不修改源代码就能够更换底层所使用的XML解析器呢,这就必须“对抽象进行编程”,以实现底层解析器的可插入性。8.2在JAXP中使用DOM解析器处理XML文档+newInstance():DocumentBuilderFactoryDocumentBuilderFactory+newDocumentBuilder():DocumentBuilderConcreteDocumentBuilderFactory1+newDocumentBuilder():DocumentBuilderConcreteDocumentBuilderFactory2DocumentBuilder+parse():DocumentConcreteDocumentBuilder1+parse():DocumentConcreteDocumentBuilder2+org.w3c.dom.Document接口中的各种操作()接口Document+Document接口操作实现()Document1+Document接口操作实现()Document2解析器1解析器2DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();try{DocumentBuilderbuilder=dbf.newDocumentBuilder();DocumentdomDoc=builder.parse(fileName);}catch(ParserConfigurationExceptione){e.printStackTrace());};8.2.1使用JAXP在JAXP中,newInstance在确定具体解析器工厂实现类时,将按照下面的顺序进行搜索:1.使用javax.xml.parsers.DocumentBuilderFactory系统属性。2.使用JRE文件夹中的属性文件lib/jaxp.properties。此配置文件格式为标准的java.util.Properties且包含实现类的完全限定名,其中实现类的键是上述定义的系统属性。JAXP实现只读取一次jaxp.properties文件,然后缓存其值供以后使用。如果首次尝试读取文件时,文件不存在,则不会再次尝试检查该文件是否存在。首次读取jaxp.properties后,其中的属性值不能再更改。3.使用ServicesAPI(在JAR规范中进行了详细描述)来确定类名称。ServicesAPI将查找在运行时可用的jar中META-INF/services/javax.xml.parsers.DocumentBuilderFactory文件中的类名。4.平台默认的DocumentBuilderFactory实例。8.2.2DOM解析器编程接口org.w3c.xml.Node接口Node接口是整个文档对象模型的主要数据类型。它表示该文档树中的单个节点。Node接口中包含如下主要内容:表示节点类型的常量、及获得节点类型信息的方法;获得节点基本信息(名称、值)的方法;获得节点层次信息的方法;shortnodeType=node.getNodeType();switch(nodeType){caseNode.DOCUMENT_NODE:{...break;}caseNode.ELEMENT_NODE:{...break;}caseNode.ATTRIBUTE_NODE:{...break;}caseNode.TEXT_NODE:{...break;}......}获得节点的名称getNodeName()、节点的值getNodeValue()NodeListxNodeList=xNode.getChildNodes();for(inti=0;ixNodeList.getLength();){childNode=xNodeList.item(i);......}for(inti=0;iattrs.getLength();i++){AttrattrNode=attrs.item(i);//item()方法表示可以按某种顺序访问属性集合,而属性本身是没有顺序的。......}org.w3c.xml.Document接口Document接口表示整个HTML或XML文档。从概念上讲,它是文档树的根,并提供对文档数据的基本访问。请注意,文档的根元素节点并不是文档节点,文档节点在根元素节点之上,是一个无形的节点。Document接口还包含所需的、创建这些对象的工厂方法。文档节点Document接口中提供了一系列的create方法(所有的创建工作都必须使用文档节点),比如:createElement(StringtagName)创建指定类型的元素节点。createAttribute(Stringname)创建给定名称的Attr节点。createTextNode(Stringdata)创建指定字符串的Text节点。DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=dbf.newDocumentBuilder();Documentdoc=builder.newDocument();NodexNode1=doc.createElement(family);doc.appendChild(xNode1);NodexNode2=doc.createElement(parent);xNode1.appendChild(xNode2);NodexNode3=doc.createElement(child);xNode1.appendChild(xNode3);......org.w3c.xml.Element接口Element接口表示XML文档中的一个元素。可使用getAttributes()来获得元素所有属性的集合attributes(Node接口的方法);可使用Node接口提供的getChildNodes()方法获得子元素列表。定义了getElementsByTagName(Stringname),它将以文档顺序返回具有给定标记名称的所有后代元素的NodeList。org.w3c.xml.Attr接口Attr接口表示Element对象中的属性。通常该属性所允许的值定义在与文档相关的模式中。Attr对象继承Node接口,但由于它们实际上并不是相关元素的子节点,DOM不会将它们看作文档树的一部分。Node的属性parentNode、previousSibling和nextSibling都将返回null。如果要获得属性所属
本文标题:第8章《使用 JAVA 语言对 XML 数据进行解析》
链接地址:https://www.777doc.com/doc-3683826 .html