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ù):

看著很惡心是吧哈哈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ù)類型如下:

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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市联四,隨后出現(xiàn)的幾起案子撑碴,更是在濱河造成了極大的恐慌,老刑警劉巖朝墩,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件醉拓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡收苏,警方通過查閱死者的電腦和手機(jī)亿卤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹿霸,“玉大人排吴,你說我怎么就攤上這事∨呈螅” “怎么了钻哩?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵屹堰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我街氢,道長(zhǎng)扯键,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任珊肃,我火速辦了婚禮荣刑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘近范。我一直安慰自己嘶摊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布评矩。 她就那樣靜靜地躺著叶堆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斥杜。 梳的紋絲不亂的頭發(fā)上虱颗,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音蔗喂,去河邊找鬼忘渔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛缰儿,可吹牛的內(nèi)容都是我干的畦粮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼乖阵,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼宣赔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞪浸,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤儒将,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后对蒲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钩蚊,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蹈矮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砰逻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泛鸟,死狀恐怖诱渤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谈况,我是刑警寧澤勺美,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布递胧,位于F島的核電站,受9級(jí)特大地震影響赡茸,放射性物質(zhì)發(fā)生泄漏缎脾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一占卧、第九天 我趴在偏房一處隱蔽的房頂上張望遗菠。 院中可真熱鬧,春花似錦华蜒、人聲如沸辙纬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贺拣。三九已至,卻和暖如春捂蕴,著一層夾襖步出監(jiān)牢的瞬間譬涡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工啥辨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涡匀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓溉知,卻偏偏與公主長(zhǎng)得像陨瘩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子级乍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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