今天學習了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;
- }
-
- }
-
- }
-
- }