大家好茬高,還記得我們上次就說的解析XML的三種方式嗎?上一次我們說了SAX的解析方法脖岛,是有點(diǎn)繁瑣,今天我們來講一下PULL方法來解析XML颊亮。
PULL方法其實(shí)跟SAX方法很像柴梆,但是也有不一樣的地方,先來講完代碼终惑,然后再比較一下兩者的異同绍在。
PULL解析
1.創(chuàng)建PULL解析器,在這里我們有兩種方法創(chuàng)建解析器雹有,第一種是跟我們上次創(chuàng)建SAX解析器一樣偿渡,先創(chuàng)建解析器工廠,然后通過工廠創(chuàng)建解析器霸奕,
第二種我們直接用Xml類的靜態(tài)方法創(chuàng)建:
2.再創(chuàng)建完工廠之后溜宽,我們要設(shè)置一下數(shù)據(jù)的編碼格式
第一個(gè)參數(shù)是我們數(shù)據(jù)的輸入流,第二個(gè)參數(shù)是我們?cè)O(shè)置的編碼格式质帅,我們?cè)O(shè)置為utf-8格式适揉。
3.然后就開始我們正式的解析過程了:
首先這是我們今天要解析的xml數(shù)據(jù):
看著很惡心是吧哈哈A粼堋!
在這之前我們先來看一下PULLParser中比較常用的幾個(gè)方法:
獲取事件類型主要對(duì)應(yīng)我們獲取到標(biāo)簽還是結(jié)束標(biāo)簽涡扼,開始文檔還是結(jié)束文檔等稼跳。
next()對(duì)應(yīng)上面的方法,獲取到下一個(gè)事件類型
后面的四個(gè)方法應(yīng)該解釋的很清楚吃沪,就不多說了汤善。
1)獲取事件類型。
我們首先先獲取事件類型票彪,而且我們最開始獲取到的肯定是START_DOCUMENT事件類型红淡。
2判斷事件并執(zhí)行對(duì)應(yīng)邏輯
我們先寫出來總體邏輯框架,我們把整個(gè)過程寫到一個(gè)大循環(huán)中降铸,只要事件類型不是END_DOC在旱,就一直走下去。
在里面我們只需要進(jìn)行兩個(gè)事情:獲取標(biāo)簽和結(jié)束標(biāo)簽
最后不要忘記讓事件類型移向下一位(next方法)推掸。
3)代碼編寫
我們需要的數(shù)據(jù)類型如下:
首先我們通過getName方法得到標(biāo)簽名桶蝎,如果標(biāo)簽名為class,就新建一個(gè)classBean對(duì)象谅畅,然后通過解析器的getAttributeValue方法登渣,給屬性賦值,這里只有一個(gè)叫做id的屬性毡泻。然后把classBean中l(wèi)ist添加數(shù)據(jù)胜茧。
如果標(biāo)簽名為student,那只需要new一個(gè)studentBean對(duì)象就好仇味,因?yàn)樗麤]有標(biāo)簽呻顽。
如果是name,iid和sex丹墨,就分別調(diào)用nextText方法廊遍,因?yàn)樗麄兪莾?nèi)容的標(biāo)簽。
到這里我們就發(fā)現(xiàn)了贩挣,我們PULL方法無論是外標(biāo)簽還是內(nèi)容的標(biāo)簽昧碉,統(tǒng)統(tǒng)是寫到一起的。只是具體的執(zhí)行邏輯不一樣揽惹,但是執(zhí)行邏輯也是我們實(shí)現(xiàn)的被饿。
現(xiàn)在我們進(jìn)入結(jié)束標(biāo)簽的事件,還是先獲取標(biāo)簽名搪搏,這里不用多說狭握,只是把他們對(duì)應(yīng)的數(shù)據(jù)添加到對(duì)應(yīng)的list中就好。
到這里我們的PULL解析就全部完成了疯溺,我們通過日志來看一下效果:
數(shù)據(jù)也沒有問題论颅。下面我們來對(duì)比一下SAX和PULL兩個(gè)方法:
SAX和PULL方法對(duì)比
我們還記得SAX方式解析xml吧哎垦,他的解析邏輯幾乎全都是寫到了defaultHandler類的子類方法中,我們需要重寫他的5個(gè)方法恃疯,分別是開始文檔漏设,開始標(biāo)簽,結(jié)束標(biāo)簽,結(jié)束文檔,數(shù)據(jù)讀取枫虏。也就是說我們執(zhí)行到不同的事件時(shí),他會(huì)跳轉(zhuǎn)到不同的方法中犬性,然后我們?cè)趯?duì)應(yīng)方法中實(shí)現(xiàn)對(duì)應(yīng)的邏輯,最終完成XML解析腾仅。
而今天這個(gè)PULL方法不太一樣:首先我們沒有用到什么類去解析乒裆;其次所有的事件邏輯都是我們自己寫的,我們只是用一個(gè)while循環(huán)推励,在里面進(jìn)行判斷事件類型鹤耍,對(duì)應(yīng)類型的操作。
而他們的相同點(diǎn)是:都是驅(qū)動(dòng)型解析验辞。從頭到尾依次解析惰蜜,按順序掃面直到結(jié)束。
但是相比之下我們還是發(fā)現(xiàn)PULL解析比SAX解析更方便受神,更輕巧哈哈,所以一般情況下我們多數(shù)用到PULL解析格侯。(當(dāng)然SAX也是要會(huì)的)鼻听。