今天学习了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;
}
}
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
不要资源分,希望大家能有收获。 ^_*
如果觉得有帮助,顺手给我个评论~~~~多谢~