有以下兩種方法:
1罚斗、SAX解析
SAX:Simple API for XML
.基于事件驅(qū)動的解析方式窒升,逐行解析數(shù)據(jù)奈附。(采用協(xié)議回調(diào)機(jī)制)
SAX
解析XML缚够,是基于事件通知的模式,一邊讀取XML文檔一邊處理题造,不必等整個文檔加載完之后才采取操作傍菇,SAX
解析器會檢測整個XML樹形結(jié)構(gòu),你的代碼會控制它在哪里停止界赔,使用哪些數(shù)據(jù)之類的事情丢习。就是說,SAX
可控制性強(qiáng)淮悼,占用內(nèi)存小咐低,適用于提取部分?jǐn)?shù)據(jù)。當(dāng)在讀取解析過程中遇到需要處理的對象袜腥,會發(fā)出通知對其進(jìn)行處理见擦,如果XML格式在某一處出現(xiàn)錯誤,前面的數(shù)據(jù)會被提取出來羹令,錯誤后面數(shù)據(jù)的就顯示不出來鲤屡。
NSXMLParse
類是iOS自帶的XML解析類。采用SAX
方式解析數(shù)據(jù)
解析過程由NSXMLParserDelegate
協(xié)議方法回調(diào)
解析過程:開始標(biāo)簽->取值->結(jié)束標(biāo)簽->取值
代碼的實現(xiàn)過程是特恬,首先我們建立一個XML文檔执俩,并引入文件徐钠,如下:
其次我們建立一個表格試圖控制器(TableViewController
)
定義一個私有屬性數(shù)組datasource
用來存儲模型數(shù)據(jù)和startTag
屬性用來暫存起始標(biāo)簽
同時在方法ViewDidLoad
里面獲取文件數(shù)據(jù)并指定代理<NSXMLParserDelegate>//解析器協(xié)議癌刽,同時為對應(yīng)的重用標(biāo)識符注冊單元格的類型
NSXMLParserDelegate
解析器協(xié)議里面有如下方法:
當(dāng)XML在逐個解析文件數(shù)據(jù)時,由于起始標(biāo)簽和結(jié)束標(biāo)簽名字一樣尝丐,當(dāng)解析到結(jié)束標(biāo)簽時显拜,為了避免解析到的結(jié)束標(biāo)簽后面的內(nèi)容將模型對象中的相應(yīng)的屬性覆蓋,在解析結(jié)束標(biāo)簽的方法內(nèi)部將起始標(biāo)簽置為nil
在每個方法內(nèi)部我們同時打印了一下方法名爹袁,這樣我們就可以在輸出端清晰的看到方法的執(zhí)行順序远荠,
同時在表格的設(shè)置方法內(nèi)部建立重建機(jī)制
2、DOM工具解析
DOM:Document Object Model
(文檔對象模型)失息。解析時需要將XML文件整體讀入譬淳,并且將XML結(jié)構(gòu)化成樹狀,使用時再通過樹狀結(jié)構(gòu)讀取相關(guān)數(shù)據(jù)盹兢,查找特定節(jié)點邻梆,然后對節(jié)點進(jìn)行讀或?qū)憽K闹饕獌?yōu)勢是實現(xiàn)簡單绎秒,讀寫平衡浦妄;缺點是比較占內(nèi)存,因為他要把整個xml文檔都讀入內(nèi)存,文件越大剂娄,這種缺點就越明顯蠢涝。當(dāng)文件內(nèi)容出現(xiàn)錯誤時,在輸入框內(nèi)會標(biāo)記出錯誤的位置
GDataXMLNode
是Google提供的開元XML解析類阅懦,對libxml2.dylib
進(jìn)行了Objective-C的封裝和二,因此在使用GDataXML
之前,你需要先導(dǎo)入libxml2
耳胎。
iOS中包含一個C語言的動態(tài)鏈接庫libxml2.dylib
儿咱,解析速度比NSXMLParser
快