详解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并覆盖相关的方法三、XMLPullXML pull提供了开始元素和结束元素。当某个元素开始时,我们可以调用parser.nextText0从XML文档中提取所有字符数据。当解释到一个文档结束时,自动生成EndDocument事件。常用的接口和类:XmlPullParser:XML pull解析器是一个在XMLPULL VlAP1中提供了定义解析功能的接口。XmlSerializer:它是一个接口,定义了XML信息集的序列。XmlPullParserFactory:这个类用于在XMPULL V1 API中创建XML Pull解析器。以下是源码:写了一个解析接口然后分别用三个类来实现。当然还可以写成工具类的方式。MainActivity:[java] view plaincopyprint?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 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 list) { List<Map> data = new ArrayList<Map>(); for (Person p : list) { Map map = new HashMap(); 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.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 implementsOnClickListener{@Overridepublic 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 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 blocke.printStackTrace();}}public void showUI(List list){List<Map> data = new ArrayList<Map>();for (Person p : list){Map map = new HashMap();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);}}接口: [java] view plaincopyprint?package cn.yj3g.service2; import java.io.InputStream; import java.util.List; import cn.yj3g.entity.Person; public interface IXmlParseService { public List getPersonsByParseXml(InputStream is) throws Exception; } package cn.yj3g.service2;import java.io.InputStream;import java.util.List;import cn.yj3g.entity.Person;public interface IXmlParseService {public List getPersonsByParseXml(InputStream is) throws Exception;}DOM实现类: [java] view plaincopyprint?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 getPersonsByParseXml(InputStream is) throws Exception { List 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(); 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.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{@Overridepublic List getPersonsByParseXml(InputStream is) throws Exception{List 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();for (int i = 0; i < nodeList.getLength(); i++){Person person = new Person();Element element = (Element) nodeList.item(i);// 得到根节点属性:idint id = Integer.parseInt(element.getAttribute("id"));person.setId(id);// 得到孩子节点:nameNodeList nameList = element.getElementsByTagName("name");Element nameElement = (Element) nameList.item(0);String name = nameElement.getTextContent();person.setName(name);// 得到年龄:ageNodeList 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实现类: [java] view plaincopyprint?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 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 list; private Person person; private String currentTag; private List getList() { return list; } @Override public void startDocument() throws SAXException { list = new ArrayList(); } @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; } } } } 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 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 list;private Person person;private String currentTag;private List getList(){return list;}@Overridepublic void startDocument() throws SAXException{list = new ArrayList();}@Overridepublic void endDocument() throws SAXException{super.endDocument();}@Overridepublic 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;}}@Overridepublic 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;}@Overridepublic void endElement(String uri, String localName, String qName){if ("person".equals(qName)){list.add(person);person = null;}}}}Pull实现类: [java] view plaincopyprint?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 getPersonsByParseXml(InputStream is) throws Exception { List 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(); } 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; } } 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 getPersonsByParseXml(InputStream is) throws Exception{List 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();} 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测试类: [java] view plaincopyprint?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 + "]"; } } 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;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";}}要读取的Person XML文件: [html] view plaincopyprint? 刘备 12 关羽 14 张飞 15 刘备12关羽14张飞15附源码下载地址:http://download.csdn.net/detail/badboy1110/3629850不要资源分,希望大家能有收获。 ^_*如果觉得有帮助,顺手给我个评论~~~~多谢~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值