歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 詳解Android解析Xml的三種方式——DOM、SAX以及XMLpull

詳解Android解析Xml的三種方式——DOM、SAX以及XMLpull

日期:2017/3/1 11:17:28   编辑:Linux編程

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

  1. package cn.yj3g.TL23_xml_test;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import android.app.ListActivity;
  9. import android.content.res.AssetManager;
  10. import android.os.Bundle;
  11. import android.util.Log;
  12. import android.view.View;
  13. import android.view.View.OnClickListener;
  14. import android.widget.SimpleAdapter;
  15. import cn.yj3g.entity.Person;
  16. import cn.yj3g.service2.DomParseService;
  17. import cn.yj3g.service2.PullParseService;
  18. import cn.yj3g.service2.SAXParseService;
  19. public class TL23_xml_testActivity extends ListActivity implements
  20. OnClickListener
  21. {
  22. @Override
  23. public void onCreate(Bundle savedInstanceState)
  24. {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.main);
  27. findViewById(R.id.btn_dom).setOnClickListener(this);
  28. findViewById(R.id.btn_sax).setOnClickListener(this);
  29. findViewById(R.id.btn_pull).setOnClickListener(this);
  30. }
  31. public void onClick(View v)
  32. {
  33. int id = v.getId();
  34. List<Person> list = null;
  35. InputStream is = null;
  36. AssetManager manager = getAssets();
  37. try
  38. {
  39. is = manager.open("persons.xml");
  40. } catch (IOException e)
  41. {
  42. e.printStackTrace();
  43. }
  44. switch (id)
  45. {
  46. case R.id.btn_dom:
  47. try
  48. {
  49. list = new DomParseService().getPersonsByParseXml(is);
  50. showUI(list);
  51. } catch (Exception e)
  52. {
  53. e.printStackTrace();
  54. }
  55. break;
  56. case R.id.btn_sax:
  57. try
  58. {
  59. list = new SAXParseService().getPersonsByParseXml(is);
  60. showUI(list);
  61. } catch (Exception e)
  62. {
  63. e.printStackTrace();
  64. }
  65. break;
  66. case R.id.btn_pull:
  67. try
  68. {
  69. Log.v("TAG", "btn_pull");
  70. list = new PullParseService().getPersonsByParseXml(is);
  71. showUI(list);
  72. Log.v("TAG", list.size() + "");
  73. } catch (Exception e)
  74. {
  75. e.printStackTrace();
  76. }
  77. break;
  78. default:
  79. break;
  80. }
  81. try
  82. {
  83. is.close();
  84. } catch (IOException e)
  85. {
  86. // TODO Auto-generated catch block
  87. e.printStackTrace();
  88. }
  89. }
  90. public void showUI(List<Person> list)
  91. {
  92. List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
  93. for (Person p : list)
  94. {
  95. Map<String, Object> map = new HashMap<String, Object>();
  96. map.put("id", p.getId());
  97. map.put("name", p.getName());
  98. map.put("age", p.getAge());
  99. data.add(map);
  100. }
  101. String[] from =
  102. { "id", "name", "age" };
  103. int[] to =
  104. { R.id.tv_id, R.id.tv_name, R.id.tv_age };
  105. SimpleAdapter adapter = new SimpleAdapter(this, data,
  106. R.layout.person_list_item, from, to);
  107. setListAdapter(adapter);
  108. }
  109. }
接口:
  1. package cn.yj3g.service2;
  2. import java.io.InputStream;
  3. import java.util.List;
  4. import cn.yj3g.entity.Person;
  5. public interface IXmlParseService {
  6. public List<Person> getPersonsByParseXml(InputStream is) throws Exception;
  7. }
DOM實現類:
  1. package cn.yj3g.service2;
  2. import java.io.InputStream;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javax.xml.parsers.DocumentBuilder;
  6. import javax.xml.parsers.DocumentBuilderFactory;
  7. import org.w3c.dom.Document;
  8. import org.w3c.dom.Element;
  9. import org.w3c.dom.Node;
  10. import org.w3c.dom.NodeList;
  11. import cn.yj3g.entity.Person;
  12. public class DomParseService implements IXmlParseService
  13. {
  14. @Override
  15. public List<Person> getPersonsByParseXml(InputStream is) throws Exception
  16. {
  17. List<Person> list = null;
  18. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  19. DocumentBuilder builder = factory.newDocumentBuilder();
  20. Document document = builder.parse(is);
  21. Element rootElement = document.getDocumentElement();
  22. NodeList nodeList = rootElement.getElementsByTagName("person");// 得到person節點鏈表
  23. if (nodeList == null || nodeList.getLength() == 0)
  24. {
  25. return null;
  26. }
  27. list = new ArrayList<Person>();
  28. for (int i = 0; i < nodeList.getLength(); i++)
  29. {
  30. Person person = new Person();
  31. Element element = (Element) nodeList.item(i);
  32. // 得到根節點屬性:id
  33. int id = Integer.parseInt(element.getAttribute("id"));
  34. person.setId(id);
  35. // 得到孩子節點:name
  36. NodeList nameList = element.getElementsByTagName("name");
  37. Element nameElement = (Element) nameList.item(0);
  38. String name = nameElement.getTextContent();
  39. person.setName(name);
  40. // 得到年齡:age
  41. NodeList ageList = element.getElementsByTagName("age");
  42. Element ageElement = (Element) ageList.item(0);
  43. String age = ageElement.getTextContent();
  44. person.setAge(Integer.parseInt(age));
  45. list.add(person);
  46. }
  47. return list;
  48. }
  49. }
SAX實現類:
  1. package cn.yj3g.service2;
  2. import java.io.InputStream;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javax.xml.parsers.SAXParser;
  6. import javax.xml.parsers.SAXParserFactory;
  7. import org.xml.sax.Attributes;
  8. import org.xml.sax.SAXException;
  9. import org.xml.sax.helpers.DefaultHandler;
  10. import cn.yj3g.entity.Person;
  11. public class SAXParseService implements IXmlParseService
  12. {
  13. public List<Person> getPersonsByParseXml(InputStream is) throws Exception
  14. {
  15. SAXParserFactory factory = SAXParserFactory.newInstance();
  16. SAXParser parser = factory.newSAXParser();
  17. MyHandler handler = new MyHandler();
  18. parser.parse(is, handler);
  19. return handler.getList();
  20. }
  21. private class MyHandler extends DefaultHandler
  22. {
  23. private List<Person> list;
  24. private Person person;
  25. private String currentTag;
  26. private List<Person> getList()
  27. {
  28. return list;
  29. }
  30. @Override
  31. public void startDocument() throws SAXException
  32. {
  33. list = new ArrayList<Person>();
  34. }
  35. @Override
  36. public void endDocument() throws SAXException
  37. {
  38. super.endDocument();
  39. }
  40. @Override
  41. public void startElement(String uri, String localName, String qName,
  42. Attributes attributes) throws SAXException
  43. {
  44. if ("person".equals(qName))
  45. {
  46. person = new Person();
  47. person.setId(Integer.parseInt(attributes.getValue("id")));
  48. } else if ("name".equals(qName) || "age".equals(qName))
  49. {
  50. currentTag = qName;
  51. }
  52. }
  53. @Override
  54. public void characters(char[] ch, int start, int length)
  55. throws SAXException
  56. {
  57. super.characters(ch, start, length);
  58. String s = new String(ch, start, length);
  59. if ("name".equals(currentTag))
  60. {
  61. person.setName(s);
  62. } else if ("age".equals(currentTag))
  63. {
  64. person.setId(Integer.parseInt(s));
  65. }
  66. currentTag = null;
  67. }
  68. @Override
  69. public void endElement(String uri, String localName, String qName)
  70. {
  71. if ("person".equals(qName))
  72. {
  73. list.add(person);
  74. person = null;
  75. }
  76. }
  77. }
  78. }
Copyright © Linux教程網 All Rights Reserved