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

来源:互联网 发布:mtcnn tensorflow 编辑:程序博客网 时间:2024/05/16 10:12

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

[日期:2011-09-26]来源:Linux社区  作者:badboy1110

今天学习了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. }  

    Pull实现类:
    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. }  
    Person测试类:
    1. package cn.yj3g.entity;  
    2.   
    3. public class Person {  
    4.   
    5.     private int id;  
    6.     private String name;  
    7.     private int age;  
    8.   
    9.     public Person(int id, String name, int age) {  
    10.         super();  
    11.         this.id = id;  
    12.         this.name = name;  
    13.         this.age = age;  
    14.     }  
    15.   
    16.     public Person() {  
    17.         super();  
    18.     }  
    19.   
    20.     public int getId() {  
    21.         return id;  
    22.     }  
    23.   
    24.     public void setId(int id) {  
    25.         this.id = id;  
    26.     }  
    27.   
    28.     public String getName() {  
    29.         return name;  
    30.     }  
    31.   
    32.     public void setName(String name) {  
    33.         this.name = name;  
    34.     }  
    35.   
    36.     public int getAge() {  
    37.         return age;  
    38.     }  
    39.   
    40.     public void setAge(int age) {  
    41.         this.age = age;  
    42.     }  
    43.   
    44.     @Override  
    45.     public String toString() {  
    46.         return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";  
    47.     }  
    48. }  
    要读取的Person  XML文件:
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <persons>  
    3.     <person id="1">  
    4.         <name>刘备</name>  
    5.         <age>12</age>     
    6.     </person>  
    7.     <person id="2">  
    8.         <name>关羽</name>  
    9.         <age>14</age>     
    10.     </person>  
    11.     <person id="3">  
    12.         <name>张飞</name>  
    13.         <age>15</age>     
    14.     </person>  
    15. </persons>  

    附源码下载地址:

    免费下载地址在 http://linux.linuxidc.com/

    用户名与密码都是www.linuxidc.com

    具体下载目录在 /pub/Android源码集锦/2011年/9月/详解Android解析Xml的三种方式——DOM、SAX以及XMLpull/