详解Android解析Xml的三种方式——DOM、SAX以及XMLpull

今天学习了Android解析Xml的三种方式——DOM、SAX以及XMLpull,这里对它们进行总结。

如果理解有误,欢迎指正   ^_*

一、DOM方式解析:

xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据。这个写起来很简单,但是很消耗内存。要是数据过大,手机不够牛逼,可能手机直接死机。

常用的DoM接口和类:

Document:该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础。
Element:该接口继承Node接口,提供了获取、修改XML元素名字和属性的方法。
Node:该接口提供处理并获取节点和子节点值的方法。
NodeList:提供获得节点个数和当前节点的方法。这样就可以迭代地访问各个节点。
DOMParser:该类是Apache的Xerces中的DOM解析器类,可直接解析XML文件。

二、SAX解析技术:

SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

常用的接口和类:

Attrbutes:用于得到属性的个数、名字和值。
DefaultHandler:它提供了这些接LI的缺省实现。在大多数情况下,为应用程序扩展DefaultHandler并覆盖相关的方法

三、XMLPull

XML pull提供了开始元素和结束元素。当某个元素开始时,我们可以调用parser.nextText0从XML文档中提取所有字符数据。当解释到一个文档结束时,自动生成EndDocument
事件。

常用的接口和类:

XmlPullParser:XML pull解析器是一个在XMLPULL VlAP1中提供了定义解析功能的接口。
XmlSerializer:它是一个接口,定义了XML信息集的序列。
XmlPullParserFactory:这个类用于在XMPULL V1 API中创建XML Pull解析器。

以下是源码:

写了一个解析接口然后分别用三个类来实现。当然还可以写成工具类的方式。

MainActivity:

  1. package cn.yj3g.TL23_xml_test;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.ArrayList;  
  6. import java.util.HashMap;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9.   
  10. import android.app.ListActivity;  
  11. import android.content.res.AssetManager;  
  12. import android.os.Bundle;  
  13. import android.util.Log;  
  14. import android.view.View;  
  15. import android.view.View.OnClickListener;  
  16. import android.widget.SimpleAdapter;  
  17. import cn.yj3g.entity.Person;  
  18. import cn.yj3g.service2.DomParseService;  
  19. import cn.yj3g.service2.PullParseService;  
  20. import cn.yj3g.service2.SAXParseService;  
  21.   
  22. public class TL23_xml_testActivity extends ListActivity implements  
  23.         OnClickListener  
  24. {  
  25.     @Override  
  26.     public void onCreate(Bundle savedInstanceState)  
  27.     {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.main);  
  30.   
  31.         findViewById(R.id.btn_dom).setOnClickListener(this);  
  32.         findViewById(R.id.btn_sax).setOnClickListener(this);  
  33.         findViewById(R.id.btn_pull).setOnClickListener(this);  
  34.     }  
  35.   
  36.     public void onClick(View v)  
  37.     {  
  38.         int id = v.getId();  
  39.         List<Person> list = null;  
  40.         InputStream is = null;  
  41.         AssetManager manager = getAssets();  
  42.         try  
  43.         {  
  44.             is = manager.open("persons.xml");  
  45.         } catch (IOException e)  
  46.         {  
  47.             e.printStackTrace();  
  48.         }  
  49.         switch (id)  
  50.         {  
  51.         case R.id.btn_dom:  
  52.             try  
  53.             {  
  54.                 list = new DomParseService().getPersonsByParseXml(is);  
  55.                 showUI(list);  
  56.             } catch (Exception e)  
  57.             {  
  58.                 e.printStackTrace();  
  59.             }  
  60.             break;  
  61.         case R.id.btn_sax:  
  62.             try  
  63.             {  
  64.                 list = new SAXParseService().getPersonsByParseXml(is);  
  65.                 showUI(list);  
  66.             } catch (Exception e)  
  67.             {  
  68.                 e.printStackTrace();  
  69.             }  
  70.             break;  
  71.         case R.id.btn_pull:  
  72.             try  
  73.             {  
  74.                 Log.v("TAG""btn_pull");  
  75.                 list = new PullParseService().getPersonsByParseXml(is);  
  76.                 showUI(list);  
  77.                 Log.v("TAG", list.size() + "");  
  78.             } catch (Exception e)  
  79.             {  
  80.                 e.printStackTrace();  
  81.             }  
  82.             break;  
  83.         default:  
  84.             break;  
  85.         }  
  86.         try  
  87.         {  
  88.   
  89.             is.close();  
  90.         } catch (IOException e)  
  91.         {  
  92.             // TODO Auto-generated catch block   
  93.             e.printStackTrace();  
  94.         }  
  95.     }  
  96.   
  97.     public void showUI(List<Person> list)  
  98.     {  
  99.         List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();  
  100.         for (Person p : list)  
  101.         {  
  102.             Map<String, Object> map = new HashMap<String, Object>();  
  103.             map.put("id", p.getId());  
  104.             map.put("name", p.getName());  
  105.             map.put("age", p.getAge());  
  106.             data.add(map);  
  107.         }  
  108.         String[] from =  
  109.         { "id""name""age" };  
  110.         int[] to =  
  111.         { R.id.tv_id, R.id.tv_name, R.id.tv_age };  
  112.         SimpleAdapter adapter = new SimpleAdapter(this, data,  
  113.                 R.layout.person_list_item, from, to);  
  114.         setListAdapter(adapter);  
  115.     }  
  116. }  
接口:
  1. package cn.yj3g.service2;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.List;  
  5.   
  6. import cn.yj3g.entity.Person;  
  7.   
  8. public interface IXmlParseService {  
  9.   
  10.     public List<Person> getPersonsByParseXml(InputStream is) throws Exception;  
  11. }  
DOM实现类:
  1. package cn.yj3g.service2;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import javax.xml.parsers.DocumentBuilder;  
  8. import javax.xml.parsers.DocumentBuilderFactory;  
  9.   
  10. import org.w3c.dom.Document;  
  11. import org.w3c.dom.Element;  
  12. import org.w3c.dom.Node;  
  13. import org.w3c.dom.NodeList;  
  14.   
  15. import cn.yj3g.entity.Person;  
  16.   
  17. public class DomParseService implements IXmlParseService  
  18. {  
  19.   
  20.     @Override  
  21.     public List<Person> getPersonsByParseXml(InputStream is) throws Exception  
  22.     {  
  23.         List<Person> list = null;  
  24.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  25.         DocumentBuilder builder = factory.newDocumentBuilder();  
  26.         Document document = builder.parse(is);  
  27.         Element rootElement = document.getDocumentElement();  
  28.         NodeList nodeList = rootElement.getElementsByTagName("person");// 得到person节点链表   
  29.         if (nodeList == null || nodeList.getLength() == 0)  
  30.         {  
  31.             return null;  
  32.         }  
  33.         list = new ArrayList<Person>();  
  34.         for (int i = 0; i < nodeList.getLength(); i++)  
  35.         {  
  36.             Person person = new Person();  
  37.             Element element = (Element) nodeList.item(i);  
  38.   
  39.             // 得到根节点属性:id   
  40.             int id = Integer.parseInt(element.getAttribute("id"));  
  41.             person.setId(id);  
  42.   
  43.             // 得到孩子节点:name   
  44.             NodeList nameList = element.getElementsByTagName("name");  
  45.             Element nameElement = (Element) nameList.item(0);  
  46.             String name = nameElement.getTextContent();  
  47.             person.setName(name);  
  48.   
  49.             // 得到年龄:age   
  50.             NodeList ageList = element.getElementsByTagName("age");  
  51.             Element ageElement = (Element) ageList.item(0);  
  52.             String age = ageElement.getTextContent();  
  53.             person.setAge(Integer.parseInt(age));  
  54.   
  55.             list.add(person);  
  56.   
  57.         }  
  58.   
  59.         return list;  
  60.     }  
  61. }  
SAX实现类:
  1. package cn.yj3g.service2;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import javax.xml.parsers.SAXParser;  
  8. import javax.xml.parsers.SAXParserFactory;  
  9.   
  10. import org.xml.sax.Attributes;  
  11. import org.xml.sax.SAXException;  
  12. import org.xml.sax.helpers.DefaultHandler;  
  13.   
  14. import cn.yj3g.entity.Person;  
  15.   
  16. public class SAXParseService implements IXmlParseService  
  17. {  
  18.   
  19.     public List<Person> getPersonsByParseXml(InputStream is) throws Exception  
  20.     {  
  21.         SAXParserFactory factory = SAXParserFactory.newInstance();  
  22.         SAXParser parser = factory.newSAXParser();  
  23.         MyHandler handler = new MyHandler();  
  24.         parser.parse(is, handler);  
  25.         return handler.getList();  
  26.     }  
  27.   
  28.     private class MyHandler extends DefaultHandler  
  29.     {  
  30.         private List<Person> list;  
  31.         private Person person;  
  32.         private String currentTag;  
  33.   
  34.         private List<Person> getList()  
  35.         {  
  36.             return list;  
  37.         }  
  38.   
  39.         @Override  
  40.         public void startDocument() throws SAXException  
  41.         {  
  42.             list = new ArrayList<Person>();  
  43.         }  
  44.   
  45.         @Override  
  46.         public void endDocument() throws SAXException  
  47.         {  
  48.             super.endDocument();  
  49.         }  
  50.   
  51.         @Override  
  52.         public void startElement(String uri, String localName, String qName,  
  53.                 Attributes attributes) throws SAXException  
  54.         {  
  55.             if ("person".equals(qName))  
  56.             {  
  57.                 person = new Person();  
  58.                 person.setId(Integer.parseInt(attributes.getValue("id")));  
  59.             } else if ("name".equals(qName) || "age".equals(qName))  
  60.             {  
  61.                 currentTag = qName;  
  62.             }  
  63.         }  
  64.   
  65.         @Override  
  66.         public void characters(char[] ch, int start, int length)  
  67.                 throws SAXException  
  68.         {  
  69.             super.characters(ch, start, length);  
  70.             String s = new String(ch, start, length);  
  71.             if ("name".equals(currentTag))  
  72.             {  
  73.                 person.setName(s);  
  74.             } else if ("age".equals(currentTag))  
  75.             {  
  76.                 person.setId(Integer.parseInt(s));  
  77.             }  
  78.             currentTag = null;  
  79.         }  
  80.   
  81.         @Override  
  82.         public void endElement(String uri, String localName, String qName)  
  83.         {  
  84.             if ("person".equals(qName))  
  85.             {  
  86.                 list.add(person);  
  87.                 person = null;  
  88.             }  
  89.   
  90.         }  
  91.   
  92.     }  
  93.   
  94. }  

相关推荐