歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

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