有以下兩種方法:
1、SAX解析
SAX:Simple API for XML .基于事件驅(qū)動(dòng)的解析方式,逐行解析數(shù)據(jù)。(采用協(xié)議回調(diào)機(jī)制)
SAX解析XML,是基于事件通知的模式,一邊讀取XML文檔一邊處理,不必等整個(gè)文檔加載完之后才采取操作,SAX解析器會(huì)檢測(cè)整個(gè)XML樹形結(jié)構(gòu),你的代碼會(huì)控制它在哪里停止,使用哪些數(shù)據(jù)之類的事情。就是說,SAX可控制性強(qiáng),占用內(nèi)存小,適用于提取部分?jǐn)?shù)據(jù)。當(dāng)在讀取解析過程中遇到需要處理的對(duì)象,會(huì)發(fā)出通知對(duì)其進(jìn)行處理,如果XML格式在某一處出現(xiàn)錯(cuò)誤,前面的數(shù)據(jù)會(huì)被提取出來,錯(cuò)誤后面數(shù)據(jù)的就顯示不出來。
NSXMLParse類是iOS自帶的XML解析類。采用SAX方式解析數(shù)據(jù)
解析過程由NSXMLParserDelegate協(xié)議方法回調(diào)
解析過程:開始標(biāo)簽->取值->結(jié)束標(biāo)簽->取值
代碼的實(shí)現(xiàn)過程是,首先我們建立一個(gè)XML文檔,并引入文件,如下:

其次我們建立一個(gè)表格試圖控制器(TableViewController)
定義一個(gè)私有屬性數(shù)組datasource用來存儲(chǔ)模型數(shù)據(jù)和startTag屬性用來暫存起始標(biāo)簽

同時(shí)在方法ViewDidLoad里面獲取文件數(shù)據(jù)并指定代理<NSXMLParserDelegate>//解析器協(xié)議,同時(shí)為對(duì)應(yīng)的重用標(biāo)識(shí)符注冊(cè)單元格的類型

NSXMLParserDelegate 解析器協(xié)議里面有如下方法:

當(dāng)XML在逐個(gè)解析文件數(shù)據(jù)時(shí),由于起始標(biāo)簽和結(jié)束標(biāo)簽名字一樣,當(dāng)解析到結(jié)束標(biāo)簽時(shí),為了避免解析到的結(jié)束標(biāo)簽后面的內(nèi)容將模型對(duì)象中的相應(yīng)的屬性覆蓋,在解析結(jié)束標(biāo)簽的方法內(nèi)部將起始標(biāo)簽置為nil
在每個(gè)方法內(nèi)部我們同時(shí)打印了一下方法名,這樣我們就可以在輸出端清晰的看到方法的執(zhí)行順序,
同時(shí)在表格的設(shè)置方法內(nèi)部建立重建機(jī)制

2、DOM工具解析
DOM:Document Object Model(文檔對(duì)象模型)。解析時(shí)需要將XML文件整體讀入,并且將XML結(jié)構(gòu)化成樹狀,使用時(shí)再通過樹狀結(jié)構(gòu)讀取相關(guān)數(shù)據(jù),查找特定節(jié)點(diǎn),然后對(duì)節(jié)點(diǎn)進(jìn)行讀或?qū)憽K闹饕獌?yōu)勢(shì)是實(shí)現(xiàn)簡(jiǎn)單,讀寫平衡;缺點(diǎn)是比較占內(nèi)存,因?yàn)樗颜麄€(gè)xml文檔都讀入內(nèi)存,文件越大,這種缺點(diǎn)就越明顯。當(dāng)文件內(nèi)容出現(xiàn)錯(cuò)誤時(shí),在輸入框內(nèi)會(huì)標(biāo)記出錯(cuò)誤的位置
GDataXMLNode是Google提供的開元XML解析類,對(duì)libxml2.dylib進(jìn)行了Objective-C的封裝,因此在使用GDataXML之前,你需要先導(dǎo)入libxml2。
iOS中包含一個(gè)C語言的動(dòng)態(tài)鏈接庫libxml2.dylib,解析速度比NSXMLParser快
