-------------------------------------SAX解析xml----------------------------------
》Sax定義
SAX是一個解析速度快并且占用記憶體少的xml解析器,非常适合用于android等移動裝置
SAX全稱是Simple API for Xml,既是指一種接口,也是一個軟體包
作為接口,sax是事件驅動型xml解析的一個标準接口
》Sax特點
1. 解析效率高,占用記憶體少
2.可以随時停止解析
3.不能載入整個文檔到記憶體
4.不能寫入xml
5.SAX解析xml檔案采用的是事件驅動
---sax并不需要解析完 整個文檔,在按内容順序解析文檔的過程中,sax會判斷目前讀到的字元是否合法xml文法中的某部分,如果符合就會觸發事件
》Sax工作原理
Sax的工作原理簡單的說,就是對文檔進行順序掃描,掃描到文檔(document)開始與結束,掃描到元素(element)開始、結束等地方時調用事件處理
處理函數做相應動作,然後繼續掃描,直到文檔結束。
》Sax解析文檔過程
1.繼承DefaultHandler ,并實作方法
2.建立SAX解析器工廠
3.獲得解析器
4.獲得輸入流
5.使用輸入流,和實作接口作參數,調用解析器的解析方法進行解析
》defaultHandler 接口是實作contentHandler接口
ContentHandler接口中的常用方法
>startDocument()
當遇到文檔開頭的時候,調用這個方法,可以在其中做一些與準備工作
>endDocument()
當文檔結束的時候,調用這個方法,可以在其中做一些善後工作
>startElement(String namespaceURL, String localName, String qName, Attributes atts)
當讀到一個開始标簽的時候,會觸發這個方法。namespaceURL就是命名空間,localName是不帶命名空間字首的标簽名,
qName是待命名空間字首的标簽名。通過atts可以得到所有的屬性名和相應的值。
>endElement(String uri, String localName, String name)
當遇到結束标簽的時候,調用這個方法
>characters(char[] ch, int start, int length)
這個方法用來處理在xml檔案中讀到的内容,第一個參數為檔案的字元串内容,後面兩個參數是讀到的字元串在這個數組中的起始位置和長度,
使用new String(ch, start, length)就可以擷取内容
---------------------------------------Dom解析Xml--------------------------------------------
》DOM簡介
dom全稱Document Object Model ,為xml文檔的已解析版本定義了一組接口。解析器讀入整個文檔,然後建構一個主流記憶體的樹結構,
然後代碼就可以使用dom接口來操作這個樹結構
》DOM的特點
>優點
1.整個文檔樹在記憶體中,便于操作;支援删除、修改、重新排列等多種功能
2.通過樹形結構存取xml文檔
3.可以在樹的某個節點上向前或向後移動
>缺點
1.将整個文檔調入記憶體(包括無用的節點),浪費時間和空間
>适用場合
一旦解析了文檔還需多次通路這些資料;硬體資源充足(記憶體,cpu)
》DOM解析步驟
1.建立解析器工廠
2.獲得解析器工廠
3.接受一個xml文檔作為輸入參數名,并得到一個xml的文檔對象(Document)
4.操作文檔對象
--------------------------------------pull解析-----------------------------
》pull解析器簡介
1.pull解析器是android内置的解析器,解析原理與sax類似
2.pull它提供了類似的事件。
如:開始元素和結束元素事件,使用parse.next()可以進入下一個元素并觸發相應的事件,事件将作為數值代碼被發送
是以可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法擷取下一個Text類型節點的值
》pull與sax的不同之處
1.pull讀取xml檔案後觸發相應的事件調用方法傳回的是數字。
2.pull可以在程式中控制,想解析到哪裡就可以停止到哪裡
3.Android中更推薦使用pull解析
》pull解析步驟
1.建立解析器對象
XmlPullParser paser = Xml.newPullParser();
2.進行解析
paser.setInput(input,"utf-8");
3.産生第一個解析事件
int eventType = paser.getEventType();
4.可以使用循環判斷是否繼續解析
while(eventType!=XmlPullParser.END_DOCUMENT){}