Android Xml解析

来源:互联网 发布:php异步执行 编辑:程序博客网 时间:2024/04/16 22:38


 

在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代码  收藏代码
  1. <?xml version="1.0"?>  
  2.     <persons>  
  3.         <person id="1">  
  4.             <name>tom</name>  
  5.             <age>13</age>  
  6.         </person>  
  7.         <person id="2">  
  8.             <name>jerry</name>  
  9.             <age>14</age>  
  10.         </person>  
  11.         <person id="3">  
  12.             <name>john</name>  
  13.             <age>34</age>  
  14.         </person>  
  15.     </persons>  

 SAX解析代码:

Java代码  收藏代码
  1. package com.iteye.androidtoast.resolver;  
  2.   
  3.   
  4. import java.io.InputStream;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. import javax.xml.parsers.SAXParser;  
  9. import javax.xml.parsers.SAXParserFactory;  
  10.   
  11. import org.xml.sax.Attributes;  
  12. import org.xml.sax.SAXException;  
  13. import org.xml.sax.helpers.DefaultHandler;  
  14.   
  15. import android.util.Log;  
  16.   
  17. import com.iteye.androidtaost.model.Person;  
  18. import com.iteye.androidtaost.service.ParseService;  
  19.   
  20. public class Sax implements ParseService{  
  21.     /*SAX解析,是基于事件的,一次性加载*/  
  22.     private SAXParser parser;  
  23.       
  24.     public Sax(){  
  25.         //实例化解析工厂  
  26.         SAXParserFactory f=SAXParserFactory.newInstance();  
  27.         try {  
  28.             parser=f.newSAXParser();  
  29.         } catch (Exception e) {  
  30.             e.printStackTrace();  
  31.             Log.i("Sax",e.getMessage());  
  32.         }  
  33.     }  
  34.     @Override  
  35.     public List<Person> doParse(InputStream in) {  
  36.         XmlHandler h=new XmlHandler();  
  37.         try {  
  38.             parser.parse(in, h);  
  39.         } catch (Exception e) {  
  40.             // TODO Auto-generated catch block  
  41.             e.printStackTrace();  
  42.         }   
  43.         return h.getPersons();  
  44.     }  
  45.       
  46.     /* 
  47.      * 处理器 
  48.      */  
  49.     class XmlHandler extends DefaultHandler{  
  50.         List<Person> persons=null;  
  51.         private Person p;  
  52.         private Object currentEleName;  
  53.           
  54.           
  55.         /** 
  56.          * 开始解析文档的时候实例化集合 
  57.          */  
  58.         @Override  
  59.         public void startDocument() throws SAXException {  
  60.             persons=new ArrayList<Person>();  
  61.         }  
  62.   
  63.         @Override  
  64.         public void endDocument() throws SAXException {  
  65.             // TODO Auto-generated method stub  
  66.             super.endDocument();  
  67.         }  
  68.   
  69.         /** 
  70.          * 元素开始 
  71.          */  
  72.         @Override  
  73.         public void startElement(String uri, String localName, String qName,  
  74.                 Attributes attributes) throws SAXException {  
  75.             if("person".equals(localName)){  
  76.                 p = new Person();//节点开始的时候实例化person  
  77.                 p.id=new Integer(attributes.getValue(0));//得到ID  
  78.             }else if("name".equals(localName)){  
  79.                 this.currentEleName="name";  
  80.             }else if("age".equals(localName)){  
  81.                 this.currentEleName="age";  
  82.             }  
  83.                   
  84.         }  
  85.   
  86.         /** 
  87.          * 元素结束事件 
  88.          */  
  89.         @Override  
  90.         public void endElement(String uri, String localName, String qName)  
  91.                 throws SAXException {  
  92.             //解析到文档末尾  
  93.             if("person".equals(localName)){  
  94.                 //将解析完成的对象添加到集合  
  95.                 persons.add(p);  
  96.             }else if("name".equals(localName)||"age".equals(localName)){  
  97.                 this.currentEleName="";  
  98.             }  
  99.         }  
  100.   
  101.         /**) 
  102.          * 用户处理字符节点 
  103.          */  
  104.         @Override  
  105.         public void characters(char[] ch, int start, int length)  
  106.                 throws SAXException {  
  107.             String str=new String(ch,start,length);  
  108.             if("name".equals(currentEleName)){  
  109.                 p.name=str;  
  110.             }else if("age".equals(currentEleName)){  
  111.                 p.age=new Integer(str);  
  112.             }  
  113.         }  
  114.           
  115.         public List<Person> getPersons(){  
  116.             return persons;  
  117.         }  
  118.           
  119.     }  
  120.       
  121. }  

 DOM解析代码:

Java代码  收藏代码
  1. package com.iteye.androidtoast.resolver;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. import javax.xml.parsers.DocumentBuilder;  
  9. import javax.xml.parsers.DocumentBuilderFactory;  
  10. import javax.xml.parsers.ParserConfigurationException;  
  11.   
  12. import org.w3c.dom.Document;  
  13. import org.w3c.dom.Element;  
  14. import org.w3c.dom.NodeList;  
  15. import org.xml.sax.SAXException;  
  16.   
  17. import com.iteye.androidtaost.model.Person;  
  18. import com.iteye.androidtaost.service.ParseService;  
  19. /* 
  20.  * DOM解析 
  21.  */  
  22. public class Dom implements ParseService{  
  23.   
  24.     /** 
  25.      * 文档构建器 
  26.      */  
  27.     private DocumentBuilder builder;  
  28.     private Person person;  
  29.       
  30.     public Dom(){  
  31.         //获取构建器  
  32.         DocumentBuilderFactory f=DocumentBuilderFactory.newInstance();  
  33.         try {  
  34.             builder=f.newDocumentBuilder();  
  35.         } catch (ParserConfigurationException e) {  
  36.             e.printStackTrace();  
  37.         }  
  38.     }  
  39.     @Override  
  40.     public List<Person> doParse(InputStream in) {  
  41.         List<Person> persons=new ArrayList<Person>();  
  42.         try {  
  43.             Document doc=builder.parse(in);  
  44.             NodeList list=doc.getElementsByTagName("person");  
  45.             for(int i=0;i<list.getLength();i++){  
  46.                 //提取Person元素  
  47.                 Element el=(Element) list.item(i);  
  48.                 person = new Person();  
  49.                 //获取ID节点  
  50.                 person.id=new Integer(el.getAttribute("id"));  
  51.                 person.name=getSubelementTextContentByName(el,"name");  
  52.                 person.age=new Integer(getSubelementTextContentByName(el,"age"));  
  53.                   
  54.                 persons.add(person);  
  55.             }  
  56.             return persons;  
  57.         } catch (SAXException e) {  
  58.             e.printStackTrace();  
  59.         } catch (IOException e) {  
  60.             e.printStackTrace();  
  61.         }  
  62.         return null;  
  63.     }  
  64.     /** 
  65.      * 得到指定元素的子元素文本 节点( 
  66.      * @param el 父元素 
  67.      * @param name 子元素名称  
  68.      * @return 
  69.      */  
  70.     private String getSubelementTextContentByName(Element el, String name) {  
  71.         NodeList list=el.getElementsByTagName(name);  
  72.         Element e=(Element) list.item(0);  
  73.         return e.getTextContent();   
  74.     }  
  75.   
  76.   
  77.   
  78. }  

 Pull解析代码:

Java代码  收藏代码
  1. package com.iteye.androidtoast.resolver;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. import org.xmlpull.v1.XmlPullParser;  
  9. import org.xmlpull.v1.XmlPullParserException;  
  10.   
  11. import android.util.Xml;  
  12.   
  13. import com.iteye.androidtaost.model.Person;  
  14. import com.iteye.androidtaost.service.ParseService;  
  15.   
  16. public class Pull implements ParseService{  
  17.   
  18.     private String tagName;  
  19.   
  20.     @Override  
  21.     public List<Person> doParse(InputStream in) {  
  22.         List<Person> persons=null;  
  23.         Person person=null;  
  24.           
  25.         XmlPullParser parser=Xml.newPullParser();  
  26.         try {  
  27.             parser.setInput(in, "utf-8");  
  28.             //获取事件类型  
  29.             int eventType=parser.getEventType();  
  30.               
  31.             while(eventType!=XmlPullParser.END_DOCUMENT){  
  32.                 switch(eventType){  
  33.                 //文档开始  
  34.                 case XmlPullParser.START_DOCUMENT:  
  35.                      persons=new ArrayList<Person>();  
  36.                      break;  
  37.                 case XmlPullParser.START_TAG:  
  38.                     tagName = parser.getName();  
  39.                     if("person".equals(tagName)){  
  40.                         person=new Person();  
  41.                         person.id=new Integer(parser.getAttributeValue(0));  
  42.                     }else if("name".equals(tagName)){  
  43.                         person.name=parser.nextText();  
  44.                     }else if("age".equals(tagName)){  
  45.                         person.age=new Integer(parser.nextText());  
  46.                     }  
  47.                     break;  
  48.                 case XmlPullParser.END_TAG:  
  49.                     if("person".equals(parser.getName())){  
  50.                         persons.add(person);  
  51.                     }  
  52.                     break;  
  53.                 }  
  54.                 eventType=parser.next();  
  55.             }  
  56.               
  57.         } catch (XmlPullParserException e) {  
  58.             // TODO Auto-generated catch block  
  59.             e.printStackTrace();  
  60.         } catch (IOException e) {  
  61.             // TODO Auto-generated catch block  
  62.             e.printStackTrace();  
  63.         }  
  64.         return persons;  
  65.     }  
  66.