scott'sblogAndroid中解析XMLandroidbooksexceptionstringattributesxmlXML在各种开发中都广泛应用,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?1.?xmlversion=1.0encoding=utf-8?2.books3.book4.id1001/id5.nameThinkingInJava/name6.price80.00/price7./book8.book9.id1002/id10.nameCoreJava/name11.price90.00/price12./book13.book14.id1003/id15.nameHello,Andriod/name16.price100.00/price17./book18./books然后我们分别使用以上三种解析技术解析文档,得到一个ListBook的对象,先来看一下Book.java的代码:[java]viewplaincopyprint?1.packagecom.scott.xml.model;2.3.publicclassBook{4.privateintid;5.privateStringname;6.privatefloatprice;7.8.publicintgetId(){9.returnid;10.}11.12.publicvoidsetId(intid){13.this.id=id;14.}15.16.publicStringgetName(){17.returnname;18.}19.20.publicvoidsetName(Stringname){21.this.name=name;22.}23.24.publicfloatgetPrice(){25.returnprice;26.}27.28.publicvoidsetPrice(floatprice){29.this.price=price;30.}31.32.@Override33.publicStringtoString(){34.returnid:+id+,name:+name+,price:+price;35.}36.}最后,我们还要把这个集合对象中的数据生成一个新的XML文档,如图:生成的XML结构跟原始文档略有不同,是下面这种格式:[xhtml]viewplaincopyprint?1.?xmlversion=1.0encoding=UTF-8?2.books3.bookid=10014.nameThinkingInJava/name5.price80.0/price6./book7.bookid=10028.nameCoreJava/name9.price90.0/price10./book11.bookid=100312.nameHello,Andriod/name13.price100.0/price14./book15./books接下来,就该介绍操作过程了,我们先为解析器定义一个BookParser接口,每种类型的解析器需要实现此接口。BookParser.java代码如下:[java]viewplaincopyprint?1.packagecom.scott.xml.parser;2.3.importjava.io.InputStream;4.importjava.util.List;5.6.importcom.scott.xml.model.Book;7.8.publicinterfaceBookParser{9./**10.*解析输入流得到Book对象集合11.*@paramis12.*@return13.*@throwsException14.*/15.publicListBookparse(InputStreamis)throwsException;16.17./**18.*序列化Book对象集合得到XML形式的字符串19.*@parambooks20.*@return21.*@throwsException22.*/23.publicStringserialize(ListBookbooks)throwsException;24.}好了,我们就该一个一个的实现该接口,完成我们的解析过程。使用SAX解析器:SaxBookParser.java代码如下:[c-sharp]viewplaincopyprint?1.packagecom.scott.xml.parser;2.3.importjava.io.InputStream;4.importjava.io.StringWriter;5.importjava.util.ArrayList;6.importjava.util.List;7.8.importjavax.xml.parsers.SAXParser;9.importjavax.xml.parsers.SAXParserFactory;10.importjavax.xml.transform.OutputKeys;11.importjavax.xml.transform.Result;12.importjavax.xml.transform.Transformer;13.importjavax.xml.transform.TransformerFactory;14.importjavax.xml.transform.sax.SAXTransformerFactory;15.importjavax.xml.transform.sax.TransformerHandler;16.importjavax.xml.transform.stream.StreamResult;17.18.importorg.xml.sax.Attributes;19.importorg.xml.sax.SAXException;20.importorg.xml.sax.helpers.AttributesImpl;21.importorg.xml.sax.helpers.DefaultHandler;22.23.importcom.scott.xml.model.Book;24.25.publicclassSaxBookParserimplementsBookParser{26.27.@Override28.publicListBookparse(InputStreamis)throwsException{29.SAXParserFactoryfactory=SAXParserFactory.newInstance();//取得SAXParserFactory实例30.SAXParserparser=factory.newSAXParser();//从factory获取SAXParser实例31.MyHandlerhandler=newMyHandler();//实例化自定义Handler32.parser.parse(is,handler);//根据自定义Handler规则解析输入流33.returnhandler.getBooks();34.}35.36.@Override37.publicStringserialize(ListBookbooks)throwsException{38.SAXTransformerFactoryfactory=(SAXTransformerFactory)TransformerFactory.newInstance();//取得SAXTransformerFactory实例39.TransformerHandlerhandler=factory.newTransformerHandler();//从factory获取TransformerHandler实例40.Transformertransformer=handler.getTransformer();//从handler获取Transformer实例41.transformer.setOutputProperty(OutputKeys.ENCODING,UTF-8);//设置输出采用的编码方式42.transformer.setOutputProperty(OutputKeys.INDENT,yes);//是否自动添加额外的空白43.transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,no);//是否忽略XML声明44.45.StringWriterwriter=newStringWriter();46.Resultresult=newStreamResult(writer);47.handler.setResult(result);48.49.Stringuri=;//代表命名空间的URI当URI无值时须置为空字符串50.StringlocalName=;//命名空间的本地名称(不包含前缀)当没有进行命名空间处理时须置为空字符串51.52.handler.startDocument();53.handler.startElement(uri,localName,books,null);54.55.AttributesImplattrs=newAttributesImpl();//负责存放元素的属性信息56.char[]ch=null;57.for(Bookbook:books){58.attrs.clear();//清空属性列表59.attrs.addAttribute(uri,localName,id,string,String.valueOf(book.getId()));//添加一个名为id的属性(type影响不大,这里设为string)6