您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 造纸印刷 > Android解析XML
Android中解析XML分类:Android2011-05-1219:32112647人阅读评论(81)收藏举报androidbooksexceptionstringattributesxmlXML在各种开发中都广泛应用,Android也不例外。作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能。今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法。在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,下面,我将一一向大家详细介绍。SAX解析器:SAX(SimpleAPIforXML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。DOM解析器:DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOMAPI遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。PULL解析器:PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。以上三种解析器,都是非常实用的解析器,我将会一一介绍。我们将会使用这三种解析技术完成一项共同的任务。我们新建一个项目,项目结构如下:我会在项目的assets目录中放置一个XML文档books.xml,内容如下:[xhtml]viewplaincopyprint??xmlversion=1.0encoding=utf-8?booksbookid1001/idnameThinkingInJava/nameprice80.00/price/bookbookid1002/idnameCoreJava/nameprice90.00/price/bookbookid1003/idnameHello,Andriod/nameprice100.00/price/book/books?xmlversion=1.0encoding=utf-8?booksbookid1001/idnameThinkingInJava/nameprice80.00/price/bookbookid1002/idnameCoreJava/nameprice90.00/price/bookbookid1003/idnameHello,Andriod/nameprice100.00/price/book/books然后我们分别使用以上三种解析技术解析文档,得到一个ListBook的对象,先来看一下Book.java的代码:[java]viewplaincopyprint?packagecom.scott.xml.model;publicclassBook{privateintid;privateStringname;privatefloatprice;publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicfloatgetPrice(){returnprice;}publicvoidsetPrice(floatprice){this.price=price;}@OverridepublicStringtoString(){returnid:+id+,name:+name+,price:+price;}}packagecom.scott.xml.model;publicclassBook{privateintid;privateStringname;privatefloatprice;publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}最后,我们还要把这个集合对象中的数据生成一个新的XML文档,如图:生成的XML结构跟原始文档略有不同,是下面这种格式:[xhtml]viewplaincopyprint??xmlversion=1.0encoding=UTF-8?booksbookid=1001nameThinkingInJava/nameprice80.0/price/bookbookid=1002nameCoreJava/nameprice90.0/price/bookbookid=1003nameHello,Andriod/nameprice100.0/price/book/books?xmlversion=1.0encoding=UTF-8?booksbookid=1001nameThinkingInJava/nameprice80.0/price/bookbookid=1002nameCoreJava/nameprice90.0/price/bookbookid=1003nameHello,Andriod/nameprice100.0/price/book/books接下来,就该介绍操作过程了,我们先为解析器定义一个BookParser接口,每种类型的解析器需要实现此接口。BookParser.java代码如下:[java]viewplaincopyprint?packagecom.scott.xml.parser;importjava.io.InputStream;importjava.util.List;importcom.scott.xml.model.Book;publicinterfaceBookParser{/***解析输入流得到Book对象集合*@paramis*@return*@throwsException*/publicListBookparse(InputStreamis)throwsException;/***序列化Book对象集合得到XML形式的字符串*@parambooks*@return*@throwsException*/publicStringserialize(ListBookbooks)throwsException;}packagecom.scott.xml.parser;importjava.io.InputStream;importjava.util.List;importcom.scott.xml.model.Book;publicinterfaceBookParser{/***解析输入流得到Book对象集合*@paramis*@return*@throwsException*/publicListBookparse(InputStreamis)throwsException;/***序列化Book对象集合得到XML形式的字符串好了,我们就该一个一个的实现该接口,完成我们的解析过程。使用SAX解析器:SaxBookParser.java代码如下:[c-sharp]viewplaincopyprint?packagecom.scott.xml.parser;importjava.io.InputStream;importjava.io.StringWriter;importjava.util.ArrayList;importjava.util.List;importjavax.xml.parsers.SAXParser;importjavax.xml.parsers.SAXParserFactory;importjavax.xml.transform.OutputKeys;importjavax.xml.transform.Result;importjavax.xml.transform.Transformer;importjavax.xml.transform.TransformerFactory;importjavax.xml.transform.sax.SAXTransformerFactory;importjavax.xml.transform.sax.TransformerHandler;importjavax.xml.transform.stream.StreamResult;importorg.xml.sax.Attributes;importorg.xml.sax.SAXException;importorg.xml.sax.helpers.AttributesImpl;importorg.xml.sax.helpers.DefaultHandler;importcom.scott.xml.model.Book;publicclassSaxBookParserimplementsBookParser{@OverridepublicListBookparse(InputStreamis)throwsException{SAXParserFactoryfactory=SAXParserFactory.newInstance();//取得SAXParserFactory实例SAXParserparser=factory.newSAXParser();//从factory获取SAXParser实例MyHandlerhandler=newMyHandler();//实例化自定义Handlerparser.parse(is,handler);//根据自定义Handler规则解析输入流returnhandler.getBooks();}@OverridepublicStringserialize(ListBookbooks)throwsException{SAXTransformerFactoryfactory=(SAXTransformerFactory)TransformerFactory.newInstance();//取得SAXTransformerFactory实例TransformerHandlerhandler=factory.newTransformerHandler();//从factory获取TransformerHandler实例Transformertransformer=handler.getTransformer();//从handler获取Transformer实例transformer.setOutputProperty(OutputKeys.ENCODING,UTF-8);//设置输出采用的编码方式transformer.setOutputProperty(OutputKeys.INDENT,
本文标题:Android解析XML
链接地址:https://www.777doc.com/doc-2897404 .html