2018-04-29—XML解析(PULL解析)

大家好,還記得我們上次就說的解析XML的三種方式嗎?上一次我們說了SAX的解析方法,是有點(diǎn)繁瑣,今天我們來講一下PULL方法來解析XML。


PULL方法其實(shí)跟SAX方法很像,但是也有不一樣的地方,先來講完代碼,然后再比較一下兩者的異同。



PULL解析

1.創(chuàng)建PULL解析器,在這里我們有兩種方法創(chuàng)建解析器,第一種是跟我們上次創(chuàng)建SAX解析器一樣,先創(chuàng)建解析器工廠,然后通過工廠創(chuàng)建解析器,

通過工廠創(chuàng)建解析器

第二種我們直接用Xml類的靜態(tài)方法創(chuàng)建:

通過xml的靜態(tài)方法

2.再創(chuàng)建完工廠之后,我們要設(shè)置一下數(shù)據(jù)的編碼格式


設(shè)置編碼格式

第一個(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ù)類型如下:

START_TAG邏輯

首先我們通過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)的。

END_TAG邏輯

現(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ì)的)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容