详解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:
- package cn.yj3g.TL23_xml_test;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import android.app.ListActivity;
- import android.content.res.AssetManager;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.SimpleAdapter;
- import cn.yj3g.entity.Person;
- import cn.yj3g.service2.DomParseService;
- import cn.yj3g.service2.PullParseService;
- import cn.yj3g.service2.SAXParseService;
- public class TL23_xml_testActivity extends ListActivity implements
- OnClickListener
- {
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- findViewById(R.id.btn_dom).setOnClickListener(this);
- findViewById(R.id.btn_sax).setOnClickListener(this);
- findViewById(R.id.btn_pull).setOnClickListener(this);
- }
- public void onClick(View v)
- {
- int id = v.getId();
- List<Person> list = null;
- InputStream is = null;
- AssetManager manager = getAssets();
- try
- {
- is = manager.open("persons.xml");
- } catch (IOException e)
- {
- e.printStackTrace();
- }
- switch (id)
- {
- case R.id.btn_dom:
- try
- {
- list = new DomParseService().getPersonsByParseXml(is);
- showUI(list);
- } catch (Exception e)
- {
- e.printStackTrace();
- }
- break;
- case R.id.btn_sax:
- try
- {
- list = new SAXParseService().getPersonsByParseXml(is);
- showUI(list);
- } catch (Exception e)
- {
- e.printStackTrace();
- }
- break;
- case R.id.btn_pull:
- try
- {
- Log.v("TAG", "btn_pull");
- list = new PullParseService().getPersonsByParseXml(is);
- showUI(list);
- Log.v("TAG", list.size() + "");
- } catch (Exception e)
- {
- e.printStackTrace();
- }
- break;
- default:
- break;
- }
- try
- {
- is.close();
- } catch (IOException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public void showUI(List<Person> list)
- {
- List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
- for (Person p : list)
- {
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("id", p.getId());
- map.put("name", p.getName());
- map.put("age", p.getAge());
- data.add(map);
- }
- String[] from =
- { "id", "name", "age" };
- int[] to =
- { R.id.tv_id, R.id.tv_name, R.id.tv_age };
- SimpleAdapter adapter = new SimpleAdapter(this, data,
- R.layout.person_list_item, from, to);
- setListAdapter(adapter);
- }
- }
- package cn.yj3g.service2;
- import java.io.InputStream;
- import java.util.List;
- import cn.yj3g.entity.Person;
- public interface IXmlParseService {
- public List<Person> getPersonsByParseXml(InputStream is) throws Exception;
- }
- package cn.yj3g.service2;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- import org.w3c.dom.Node;
- import org.w3c.dom.NodeList;
- import cn.yj3g.entity.Person;
- public class DomParseService implements IXmlParseService
- {
- @Override
- public List<Person> getPersonsByParseXml(InputStream is) throws Exception
- {
- List<Person> list = null;
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- DocumentBuilder builder = factory.newDocumentBuilder();
- Document document = builder.parse(is);
- Element rootElement = document.getDocumentElement();
- NodeList nodeList = rootElement.getElementsByTagName("person");// 得到person节点链表
- if (nodeList == null || nodeList.getLength() == 0)
- {
- return null;
- }
- list = new ArrayList<Person>();
- for (int i = 0; i < nodeList.getLength(); i++)
- {
- Person person = new Person();
- Element element = (Element) nodeList.item(i);
- // 得到根节点属性:id
- int id = Integer.parseInt(element.getAttribute("id"));
- person.setId(id);
- // 得到孩子节点:name
- NodeList nameList = element.getElementsByTagName("name");
- Element nameElement = (Element) nameList.item(0);
- String name = nameElement.getTextContent();
- person.setName(name);
- // 得到年龄:age
- NodeList ageList = element.getElementsByTagName("age");
- Element ageElement = (Element) ageList.item(0);
- String age = ageElement.getTextContent();
- person.setAge(Integer.parseInt(age));
- list.add(person);
- }
- return list;
- }
- }
- package cn.yj3g.service2;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import javax.xml.parsers.SAXParser;
- import javax.xml.parsers.SAXParserFactory;
- import org.xml.sax.Attributes;
- import org.xml.sax.SAXException;
- import org.xml.sax.helpers.DefaultHandler;
- import cn.yj3g.entity.Person;
- public class SAXParseService implements IXmlParseService
- {
- public List<Person> getPersonsByParseXml(InputStream is) throws Exception
- {
- SAXParserFactory factory = SAXParserFactory.newInstance();
- SAXParser parser = factory.newSAXParser();
- MyHandler handler = new MyHandler();
- parser.parse(is, handler);
- return handler.getList();
- }
- private class MyHandler extends DefaultHandler
- {
- private List<Person> list;
- private Person person;
- private String currentTag;
- private List<Person> getList()
- {
- return list;
- }
- @Override
- public void startDocument() throws SAXException
- {
- list = new ArrayList<Person>();
- }
- @Override
- public void endDocument() throws SAXException
- {
- super.endDocument();
- }
- @Override
- public void startElement(String uri, String localName, String qName,
- Attributes attributes) throws SAXException
- {
- if ("person".equals(qName))
- {
- person = new Person();
- person.setId(Integer.parseInt(attributes.getValue("id")));
- } else if ("name".equals(qName) || "age".equals(qName))
- {
- currentTag = qName;
- }
- }
- @Override
- public void characters(char[] ch, int start, int length)
- throws SAXException
- {
- super.characters(ch, start, length);
- String s = new String(ch, start, length);
- if ("name".equals(currentTag))
- {
- person.setName(s);
- } else if ("age".equals(currentTag))
- {
- person.setId(Integer.parseInt(s));
- }
- currentTag = null;
- }
- @Override
- public void endElement(String uri, String localName, String qName)
- {
- if ("person".equals(qName))
- {
- list.add(person);
- person = null;
- }
- }
- }
- }