大家好,還記得我們上次就說的解析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ù):
看著很惡心是吧哈哈!!
在這之前我們先來看一下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ì)的)。