六,Android Xml解析
?
在Android程序中,Xml解析与Java中几乎相同,最常用的有SAX,DOM,PULL 三种解析方式。Android中内置了pull解析方式。这也是android推荐的解析方式。下面我们就看下这三种的用法,与不同
1)SAX:(Simple APIfor XML)这种解析方式基于事件的模型。通俗的讲就是XML文件在加载的过程中,加载到不同节点会相应触发不同方法来处理。它属于一次加载。它可以处理任意大小的XML文件,它对内存的要求非常低,因为SAX采用的是读取文件的方式,也就是当它是文本文件在读,读完就完了,什么信息都没有保存。当然它也有其缺点,解析过程中无法中断,只能读取XML文件而不能修改,编码上也相对复杂与难于理解。它的常用方法:
voidstartDocument()//文档开始时触发该方法
voidendDocument()//文档结束时
voidstartElement(String uri, String localName, String qName, Attributes atts)//元素开始
voidendElement(String uri, String localName, String qName)//元素结束
voidcharacters(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文件进行解析:
?SAX解析代码:?DOM解析代码:?Pull解析代码:package com.iteye.androidtoast.resolver;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import android.util.Xml;import com.iteye.androidtaost.model.Person;import com.iteye.androidtaost.service.ParseService;public class Pull implements ParseService{private String tagName;@Overridepublic List<Person> doParse(InputStream in) {List<Person> persons=null;Person person=null;XmlPullParser parser=Xml.newPullParser();try {parser.setInput(in, "utf-8");//获取事件类型int eventType=parser.getEventType();while(eventType!=XmlPullParser.END_DOCUMENT){switch(eventType){//文档开始case XmlPullParser.START_DOCUMENT: persons=new ArrayList<Person>(); break;case XmlPullParser.START_TAG:tagName = parser.getName();if("person".equals(tagName)){person=new Person();person.id=new Integer(parser.getAttributeValue(0));}else if("name".equals(tagName)){person.name=parser.nextText();}else if("age".equals(tagName)){person.age=new Integer(parser.nextText());}break;case XmlPullParser.END_TAG:if("person".equals(parser.getName())){persons.add(person);}break;}eventType=parser.next();}} catch (XmlPullParserException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return persons;}}??
?