Android(安卓)Xml解析
在Android程序中,Xml解析与Java中几乎相同,最常用的有SAX,DOM,PULL三种解析方式。Android中内置了pull解析方式。这也是android推荐的解析方式。下面我们就看下这三种的用法,与不同
1)SAX:(Simple API for XML)这种解析方式基于事件的模型。通俗的讲就是XML文件在加载的过程中,加载到不同节点会相应触发不同方法来处理。它属于一次加载。它可以处理任意大小的XML文件,它对内存的要求非常低,因为SAX采用的是读取文件的方式,也就是当它是文本文件在读,读完就完了,什么信息都没有保存。当然它也有其缺点,解析过程中无法中断,只能读取XML文件而不能修改,编码上也相对复杂与难于理解。它的常用方法:
void startDocument()//文档开始时触发该方法
void endDocument()//文档结束时
void startElement(String uri, String localName, String qName, Attributes atts)//元素开始
void endElement(String uri, String localName, String qName)//元素结束
void characters(char[ ] ch, int start, int length)//文本节点
创建SAX解析器:
(1)用系统默认值来创建一个XMLReader(解析器):
XMLReader reader = XMLReaderFactory.createXMLReader();
(2)从给定的类名称来创建一个XMLReader:
XMLReader reader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
(3)使用javax.xml.parsers包中的SAXParserFactory类和SAXParser类创建:
SAXParserFactory spFactory = SAXParserFactory.newInstance();
SAXParser sParser = spFactory.newSAXParser();
2)DOM:(Document Object Model)文档对象模型,它是基于对象的,又或者基于树的。它属于两次加载,首先把文档载入内存,第二次把文档解析形成一棵树。如果文档过大对内存占用是很大的。但它也有其优点,它可以解析的过程中修改文件树,可以随便存储文件树的任意部分,相对容易理解。
3)Pull解析:android中内置了pull解析包。这也是android程序中所推荐的xml解析方式。从它的字面上就可以看出来,其优点,pull,拉的意思。我要什么资源我就拿什么资源。我只需要xml文件中一部分,我就拉一部分。从而节省资源,提高效率。当然在J2EE中也可以使用Pull解析。Pull解析也非常易于理解。
先上图:
我们就用这三种方式对同一个XML文件进行解析:
Xml代码- <?xmlversion="1.0"?>
- <persons>
- <personid="1">
- <name>tom</name>
- <age>13</age>
- </person>
- <personid="2">
- <name>jerry</name>
- <age>14</age>
- </person>
- <personid="3">
- <name>john</name>
- <age>34</age>
- </person>
- </persons>
SAX解析代码:
Java代码- packagecom.iteye.androidtoast.resolver;
- importjava.io.InputStream;
- importjava.util.ArrayList;
- importjava.util.List;
- importjavax.xml.parsers.SAXParser;
- importjavax.xml.parsers.SAXParserFactory;
- importorg.xml.sax.Attributes;
- importorg.xml.sax.SAXException;
- importorg.xml.sax.helpers.DefaultHandler;
- importandroid.util.Log;
- importcom.iteye.androidtaost.model.Person;
- importcom.iteye.androidtaost.service.ParseService;
- publicclassSaximplementsParseService{
- /*SAX解析,是基于事件的,一次性加载*/
- privateSAXParserparser;
- publicSax(){
- //实例化解析工厂
- SAXParserFactoryf=SAXParserFactory.newInstance();
- try{
- parser=f.newSAXParser();
- }catch(Exceptione){
- e.printStackTrace();
- Log.i("Sax",e.getMessage());
- }
- }
- @Override
- publicList<Person>doParse(InputStreamin){
- XmlHandlerh=newXmlHandler();
- try{
- parser.parse(in,h);
- }catch(Exceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- returnh.getPersons();
- }
- /*
- *处理器
- */
- classXmlHandlerextendsDefaultHandler{
- List<Person>persons=null;
- privatePersonp;
- privateObjectcurrentEleName;
- /**
- *开始解析文档的时候实例化集合
- */
- @Override
- publicvoidstartDocument()throwsSAXException{
- persons=newArrayList<Person>();
- }
- @Override
- publicvoidendDocument()throwsSAXException{
- //TODOAuto-generatedmethodstub
- super.endDocument();
- }
- /**
- *元素开始
- */
- @Override
- publicvoidstartElement(Stringuri,StringlocalName,StringqName,
- Attributesattributes)throwsSAXException{
- if("person".equals(localName)){
- p=newPerson();//节点开始的时候实例化person
- p.id=newInteger(attributes.getValue(0));//得到ID
- }elseif("name".equals(localName)){
- this.currentEleName="name";
- }elseif("age".equals(localName)){
- this.currentEleName="age";
- }
- }
- /**
- *元素结束事件
- */
- @Override
- publicvoidendElement(Stringuri,StringlocalName,StringqName)
- throwsSAXException{
- //解析到文档末尾
- if("person".equals(localName)){
- //将解析完成的对象添加到集合
- persons.add(p);
- }elseif("name".equals(localName)||"age".equals(localName)){
- this.currentEleName="";
- }
- }
- /**)
- *用户处理字符节点
- */
- @Override
- publicvoidcharacters(char[]ch,intstart,intlength)
- throwsSAXException{
- Stringstr=newString(ch,start,length);
- if("name".equals(currentEleName)){
- p.name=str;
- }elseif("age".equals(currentEleName)){
- p.age=newInteger(str);
- }
- }
- publicList<Person>getPersons(){
- returnpersons;
- }
- }
- }
DOM解析代码:
Java代码- packagecom.iteye.androidtoast.resolver;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.util.ArrayList;
- importjava.util.List;
- importjavax.xml.parsers.DocumentBuilder;
- importjavax.xml.parsers.DocumentBuilderFactory;
- importjavax.xml.parsers.ParserConfigurationException;
- importorg.w3c.dom.Document;
- importorg.w3c.dom.Element;
- importorg.w3c.dom.NodeList;
- importorg.xml.sax.SAXException;
- importcom.iteye.androidtaost.model.Person;
- importcom.iteye.androidtaost.service.ParseService;
- /*
- *DOM解析
- */
- publicclassDomimplementsParseService{
- /**
- *文档构建器
- */
- privateDocumentBuilderbuilder;
- privatePersonperson;
- publicDom(){
- //获取构建器
- DocumentBuilderFactoryf=DocumentBuilderFactory.newInstance();
- try{
- builder=f.newDocumentBuilder();
- }catch(ParserConfigurationExceptione){
- e.printStackTrace();
- }
- }
- @Override
- publicList<Person>doParse(InputStreamin){
- List<Person>persons=newArrayList<Person>();
- try{
- Documentdoc=builder.parse(in);
- NodeListlist=doc.getElementsByTagName("person");
- for(inti=0;i<list.getLength();i++){
- //提取Person元素
- Elementel=(Element)list.item(i);
- person=newPerson();
- //获取ID节点
- person.id=newInteger(el.getAttribute("id"));
- person.name=getSubelementTextContentByName(el,"name");
- person.age=newInteger(getSubelementTextContentByName(el,"age"));
- persons.add(person);
- }
- returnpersons;
- }catch(SAXExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- returnnull;
- }
- /**
- *得到指定元素的子元素文本节点(
- *@paramel父元素
- *@paramname子元素名称
- *@return
- */
- privateStringgetSubelementTextContentByName(Elementel,Stringname){
- NodeListlist=el.getElementsByTagName(name);
- Elemente=(Element)list.item(0);
- returne.getTextContent();
- }
- }
Pull解析代码:
Java代码- packagecom.iteye.androidtoast.resolver;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.util.ArrayList;
- importjava.util.List;
- importorg.xmlpull.v1.XmlPullParser;
- importorg.xmlpull.v1.XmlPullParserException;
- importandroid.util.Xml;
- importcom.iteye.androidtaost.model.Person;
- importcom.iteye.androidtaost.service.ParseService;
- publicclassPullimplementsParseService{
- privateStringtagName;
- @Override
- publicList<Person>doParse(InputStreamin){
- List<Person>persons=null;
- Personperson=null;
- XmlPullParserparser=Xml.newPullParser();
- try{
- parser.setInput(in,"utf-8");
- //获取事件类型
- inteventType=parser.getEventType();
- while(eventType!=XmlPullParser.END_DOCUMENT){
- switch(eventType){
- //文档开始
- caseXmlPullParser.START_DOCUMENT:
- persons=newArrayList<Person>();
- break;
- caseXmlPullParser.START_TAG:
- tagName=parser.getName();
- if("person".equals(tagName)){
- person=newPerson();
- person.id=newInteger(parser.getAttributeValue(0));
- }elseif("name".equals(tagName)){
- person.name=parser.nextText();
- }elseif("age".equals(tagName)){
- person.age=newInteger(parser.nextText());
- }
- break;
- caseXmlPullParser.END_TAG:
- if("person".equals(parser.getName())){
- persons.add(person);
- }
- break;
- }
- eventType=parser.next();
- }
- }catch(XmlPullParserExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }catch(IOExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- returnpersons;
- }
- }
- 转载自http://androidtoast.iteye.com/blog/1187662
更多相关文章
- 为Android应用程序读取/dev下设备而提权(二)
- Android读写XML(中)——SAX
- androidのPULL方式解析XML
- Android(安卓)创建与解析XML(一)—— 概述
- Android中使用pull解析器操作xml文件的解决办法
- Android如何解析Intent Filter
- Android(安卓)异步消息处理机制(Handler 、 Looper 、MessageQueu
- [置顶] Android学习系列-Android中解析xml(7)
- Android(安卓)下用 Pull 解析和生成 XML