Android中XML的三種解析方式


[原]Android中XML的三種解析方式

XML解析方式

Android 提供了三種解析XML的方式:SAX(Simple API XML), DOM(Document Object Model), Pull 
本文中所用的XML文檔內容如下:

<apps> <app> <id>1</id> <name>Google maps</name> <version>1.0</version> </app> <app> <id>2</id> <name>chrome</name> <version>2.1</version> </app> <app> <id>3</id> <name>google play</name> <version>3.1</version> </app> </apps>

1. SAX解析方式

SAX(Simple API for XML)解析器是一種基於事件的解析器,事件驅動的流式解析方式是,從文件的開始順序解析到文檔的結束,不可暫停或倒退。 
優點:解析速度快,占用內存少。非常適合在Android移動設備中使用。 
缺點:不會記錄標簽的關系,而要讓你的應用程序自己處理,這樣就增加了你程序的負擔。 
工作原理:對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束、文檔 (document)結束等地方時通知事件處理函數,由事件處理函數做相應動作,然后繼續同樣的掃描,直至文檔結束。 
使用步驟: 
1. 新建 ContentHanlder 類繼承 DefaultHandler 類,並重寫父類的五個方法

startDocument(): 開始解析XML時調用 
startElement(): 開始解析某個結點時調用 
characters(): 在獲取節點內容時調用 
endElement(): 在完成解析某個結點時調用 
endDocument(): 在完成整個XML解析的時候調用

2.創建函數 parseXMLWithSAX 
3.調用函數 parseXMLWithSAX 解析 XML

代碼如下: 
新建 ContentHandler 類繼承 DefaultHandler類,重寫五個父類方法

public class ContentHandler extends DefaultHandler { private String nodeName; private StringBuilder id; private StringBuilder name; private StringBuilder version; private String TAG = "SAX"; //開始解析 XML 文檔 @Override public void startDocument() throws SAXException { id = new StringBuilder(); name = new StringBuilder(); version = new StringBuilder(); } //開始解析結點 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //localName 記錄當前結點的名字 nodeName = localName; } //開始提取結點中內容 @Override public void characters(char[] ch, int start, int length) throws SAXException { if("id".equals(nodeName)) id.append(ch,start,length); else if("name".equals(nodeName)) name.append(ch,start,length); else if("version".equals(nodeName)) version.append(ch,start, length); } //結束結點解析 @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("app".equals(localName)){ //可能包含回車或換行符 Log.d(TAG, "endElement: id = " + id.toString().trim()); Log.d(TAG, "endElement: name = "+ name.toString().trim()); Log.d(TAG, "endElement: version = "+ version.toString().trim()); //打印結束后清空,否則會影響下一次內容的讀取 id.setLength(0); name.setLength(0); version.setLength(0); } } //結束XML文檔解析 @Override public void endDocument() throws SAXException { } }

創建函數 parseXMLWithSAX

//用SAX方式解析XML private void paraseXMLWithSAX(String xmlData){ try { SAXParserFactory factory = SAXParserFactory.newInstance(); XMLReader reader = factory.newSAXParser().getXMLReader(); ContentHandler handler = new ContentHandler(); //將contentHandler的實例設置到XMLReader中 reader.setContentHandler(handler); //開始解析 reader.parse(new InputSource(new StringReader(xmlData))); }catch(Exception e){ e.printStackTrace(); } }

調用的時候只需傳入xmlData即可

**【注:在Android API中,另外提供了Android.util.Xml類,同樣可以解析XML文件,使用方法類似SAX,也都需編寫Handler來處理XML的解析,但是在使用上卻比SAX來得簡單 ,如下所示: 
以android.util.XML實現XML解析: 
MyHandler myHandler=new MyHandler0; 
android.util.Xm1.parse(ur1.openC0nnection().getlnputStream0,Xm1.Encoding.UTF-8,myHandler);】**

2. Pull 方式解析

PULL解析器的運行方式和SAX類似,都是基於事件的模式。不同的是,在PULL解析過程中返回的是數字,且我們需要自己獲取產生的事件然后做相應的操作,而不像SAX那樣由處理器觸發一種事件的方法,執行我們的代碼。 
**解析過程:**XML pull提供了開始元素和結束元素。當某個元素開始時,我們可以調用parser.nextText從XML文檔中提取所有字符數據。當解釋到一個文檔結束時,自動生成EndDocument事件。

讀取到xml的聲明返回 START_DOCUMENT; 
讀取到xml的開始標簽返回 START_TAG 
讀取到xml的文本返回 TEXT 
讀取到xml的結束標簽返回 END_TAG 
讀取到xml的結束返回 END_DOCUMENT

優點: PULL解析器小巧輕便,解析速度快,簡單易用,非常適合在Android移動設備中使用,Android系統內部在解析各種XML時也是用PULL解析器,Android官方推薦開發者們使用Pull解析技術。Pull解析技術是第三方開發的開源技術,它同樣可以應用於JavaSE開發。

//用Pull方式解析XML private void parseXMLWithPull(String xmlData){ try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xmlPullParser = factory.newPullParser(); //設置輸入的內容 xmlPullParser.setInput(new StringReader(xmlData)); //獲取當前解析事件,返回的是數字 int eventType = xmlPullParser.getEventType(); //保存內容 String id = ""; String name = ""; String version=""; while (eventType != (XmlPullParser.END_DOCUMENT)){ String nodeName = xmlPullParser.getName(); switch (eventType){ //開始解析XML case XmlPullParser.START_TAG:{ //nextText()用於獲取結點內的具體內容 if("id".equals(nodeName)) id = xmlPullParser.nextText(); else if("name".equals(nodeName)) name = xmlPullParser.nextText(); else if("version".equals(nodeName)) version = xmlPullParser.nextText(); } break; //結束解析 case XmlPullParser.END_TAG:{ if("app".equals(nodeName)){ Log.d(TAG, "parseXMLWithPull: id is "+ id); Log.d(TAG, "parseXMLWithPull: name is "+ name); Log.d(TAG, "parseXMLWithPull: version is "+ version); } } break; default: break; } //下一個 eventType = xmlPullParser.next(); } } catch (Exception e) { e.printStackTrace(); } }

3. DOM方式解析

DOM,即對象文檔模型,它是將整個XML文檔載入內存(所以效率較低,不推薦使用),每一個節點當做一個對象,結合代碼分析。DOM實現時首先為XML文檔的解析定義一組接口,解析器讀入整個文檔,然后構造一個駐留內存的樹結構,這樣代碼就可以使用DOM接口來操作整個樹結構。 由於DOM在內存中以樹形結構存放,因此檢索和更新效率會更高。但是對於特別大的文檔,解析和加載整個文檔將會很耗資源。 當然,如果XML文件的內容比較小,采用DOM是可行的。 
工作原理:使用DOM對XML文件進行操作時,首先要解析文件,將文件分為獨立的元素、屬性和注釋等,然后以節點樹的形式在內存中對XML文件進行表示,就可以通過節點樹訪問文檔的內容,並根據需要修改文檔。 
使用步驟: 
采用DOM解析時具體處理步驟是:

  1. 首先利用DocumentBuilderFactory創建一個DocumentBuilderFactory實例
  2. 然后利用DocumentBuilderFactory創建DocumentBuilder
  3. 然后加載XML文檔(Document)
  4. 然后獲取文檔的根結點(Element),
  5. 然后獲取根結點中所有子節點的列表(NodeList),
  6. 然后使用再獲取子節點列表中的需要讀取的結點。

總結:三種方式的總結比較

SAX是一個用於處理XML事件驅動的“推”模型, 
優點是一種解析速度快並且占用內存少的xml解析器,它需要哪些數據再加載和解析哪些內容。 
缺點是它不會記錄標簽的關系,而要讓你的應用程序自己處理,這樣就增加了你程序的負擔。

DOM是一種文檔對象模型,DOM可以以一種獨立於平台和語言的方式訪問和修改一個文檔的內容和結構。 
**優點:**Dom技術使得用戶頁面可以動態地變化,如可以動態地顯示或隱藏一個元素,改變它們的屬性,增加一個元素等,Dom技術使得頁面的交互性大大地增強。 
缺點:是DOM解析XML文件時,會將XML文件的所有內容以文檔樹方式存放在內存中。

Pull解析和Sax解析很相似,Pull解析和Sax解析不一樣的地方是pull讀取xml文件后觸發相應的事件調用方法返回的是數字,還有pull**可以在程序中控制想解析到哪里就可以停止解析。**

DOM方式最直觀和容易理解,但是只適合XML文檔較小的時候使用,而SAX方式更適合在移動終端系統中使用,因為相比DOM占用內存少,適合處理比較大的XML文檔,最后的Pull方式使用場合和SAX類似,但是更適合需要提前結束XML文檔解析的場合。

作者:WILLMAX_007 發表於2016/5/15 14:30:03  原文鏈接
閱讀:1120 評論:0  查看評論
 
[原]Android Activity 生命周期

 

1.每個活動在其生命周期最多有四種狀態

* 運行狀態    ---------活動處於棧頂,可見,可交互

* 暫停狀態    ---------活動不在棧頂,但可見,不可交互

* 停止狀態    ---------活動不再棧頂,不可見,不可交互,有可能被回收

* 銷毀狀態    ---------活動從棧中移除

2.活動的生命周期Activity中定義了七個回調方法,覆蓋了活動的生命周期的每一個環節。七個方法的流程圖如下:

 

onCreat(): 在活動第一次被創建時調用,完成活動初始化。

onStart(): 在活動由不可見變為可見的時候調用

onResume(): 在准備好和用戶交互的時候調用

onPause(): 在准備去啟動或者恢復另一個活動的時候調用

onStop():  在活動完全不可見時調用,與onPause()的區別在於,如果啟動的新活動是一個對話框的活動,onPause()方法會得到執行,onStop()方法不會執行

onDestroy(): 在活動被銷毀之前調用

onRestart():  在活動由停止狀態變為運行狀態時調用。即活動的重新啟動

 

3. 三種生存期

1.完整生存期

     onCreate() ------->   onDestroy()

2.可見生存期(可見不一定可交互)

    onStart() ----> onStop()

3.前台生存期 (可交互)

    onResume()  --------> onPause()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM