详解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; }
DOM实现类:
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; } }
SAX实现类:
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; } } } }
Pull实现类:
package cn.yj3g.service2; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; import android.util.Log; import cn.yj3g.entity.Person; public class PullParseService implements IXmlParseService { public List<Person> getPersonsByParseXml(InputStream is) throws Exception { List<Person> list = null; Person person = null; String currentTag = null; XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser parser = factory.newPullParser(); parser.setInput(is, "utf-8"); int type = parser.getEventType(); while (type != XmlPullParser.END_DOCUMENT) { String typeName = parser.getName(); if (type == XmlPullParser.START_TAG) { Log.v("TAG", "typeName=" + typeName); if ("persons".equals(typeName)) { list = new ArrayList<Person>(); } else if ("person".equals(typeName)) { person = new Person(); int id = Integer.parseInt(parser.getAttributeValue(0)); person.setId(id); } else if ("name".equals(typeName)) { currentTag = "name"; } else if ("age".equals(typeName)) { currentTag = "age"; } } else if (type == XmlPullParser.END_TAG) { if ("person".equals(typeName)) { list.add(person); person = null; } } else if (type == XmlPullParser.TEXT) { String s = parser.getText(); if ("name".equals(currentTag)) { person.setName(s); currentTag = null; } else if ("age".equals(currentTag)) { person.setAge(Integer.parseInt(s)); currentTag = null; } } type = parser.next(); } Log.v("TAG", "size=" + list.size()); return list; } }
Person测试类:
package cn.yj3g.entity; public class Person { private int id; private String name; private int age; public Person(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public Person() { super(); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
要读取的Person XML文件:
<?xml version="1.0" encoding="utf-8"?> <persons> <person id="1"> <name>刘备</name> <age>12</age> </person> <person id="2"> <name>关羽</name> <age>14</age> </person> <person id="3"> <name>张飞</name> <age>15</age> </person> </persons>
附源码下载地址:http://download.csdn.net/detail/badboy1110/3629850
不要资源分,希望大家能有收获。 ^_*
如果觉得有帮助,顺手给我个评论~~~~多谢~