詳解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


不要資源分,希望大家能有收穫。  ^_*


如果覺得有幫助,順手給我個評論~~~~多謝~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章