前言
在實際的開發(fā)中數(shù)據(jù)解析是很普遍的事,一般網(wǎng)絡(luò)請求返回的數(shù)據(jù)有兩種格式:XML和JSON。關(guān)于JSON的解析已是主流,滿大街的解析方式。而XML的數(shù)據(jù)格式確實是很少接觸到了,但是最近項目確實接觸到了,本文就使用 GDataXMLNode解析XML數(shù)據(jù) 做一個小結(jié)。
解析JSON
-
使用iOS系統(tǒng)自帶的方法: NSJSONSerialization JSONObjectWithData: 解析
NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; NSLog(@"返回數(shù)據(jù):%@", result); JSONKit是一個不錯的輕量級的解析類,使用起來也得心應(yīng)手。
解析XML
**XML 通常有兩種方式,DOM 和 SAX
DOM:解析XML時,讀入整個XML文檔并構(gòu)建一個駐留內(nèi)存的樹結(jié)構(gòu)(節(jié)點樹),通過遍歷樹結(jié)構(gòu)可以檢索任意XML節(jié)點,讀取它的屬性和值。而且通常情況下,可以借助XPath,直接查詢XML節(jié)點。
SAX:解析XML,是基于事件通知的模式,一邊讀取XML文檔一邊處理,不必等整個文檔加載完之后才采取操作,當(dāng)在讀取解析過程中遇到需要處理的對象,會發(fā)出通知對其進行處理。當(dāng)從網(wǎng)上下載一個很大的XML文件,就可以一邊下載一邊對已經(jīng)下載好的內(nèi)容進行解析,極大的提高解析效率
NSXMLParser ,這是一個SAX方式解析XML的類庫,默認(rèn)包含在iOS SDK中,使用也比較簡單。
libxml2 是一套默認(rèn)包含在iOS SDK中的開源類庫,它是基于C語言的API,所以使用起來可能不如NSXML方便。這套類庫同時支持DOM和SAX解析,libxml2的SAX解析方式還是非??岬?,因為它可以邊讀取邊解析,
GDataXML 這是一套Google開發(fā)的DOM方式XML解析類庫,支持讀取和修改XML文檔,支持XPath方式查詢。
一、GDataXMLNode說明
GDataXMLNode是Google提供的用于XML數(shù)據(jù)處理的類集。
該類集對libxml2--DOM處理方式進行了封裝,能對較小或中等的xml文檔進行讀寫操作且支持XPath語法。
使用方法:
1、獲取GDataXMLNode.h/m文件,將GDataXMLNode.h/m文件添加到工程中
2、向工程中增加“l(fā)ibxml2.dylib”庫
#不添加會直接報錯
3、在工程的“Build Settings”頁中找到“Header Search Path”項,添加/usr/include/libxml2"到路徑中
4、添加“GDataXMLNode.h”文件到頭文件中,如工程能編譯通過,則說明GDataXMLNode添加成功
二、GDataXMLNode使用實例與解析
以一個解析天氣的數(shù)據(jù)為例:

解析源碼
NSError *err = nil;
#data 是網(wǎng)絡(luò)返回的XML數(shù)據(jù),使用 AFNetworking 請求 XML文本時報錯,
#無奈之下只好使用系統(tǒng)自帶的網(wǎng)絡(luò)請求方法 NSURLConnection。
GDataXMLDocument *doc=[[GDataXMLDocument alloc] initWithData:data encoding:NSUTF8StringEncoding error:&err];
if (err) {
return;
}
//4,獲取根數(shù)據(jù),包含了整個XML數(shù)據(jù)
GDataXMLElement *rootElement = doc.rootElement;
NSArray *stuArrayElement = rootElement.children;
#包含了 GDataXMLElement 化的最外層的 對象,
#每個 GDataXMLElement 又有 子GDataXMLElement對象,依次循環(huán)下去。
#也就是說 每個 GDataXMLElement對象即是上層GDataXMLElement對象的子GDataXMLElement,
#也是下層GDataXMLElement對象的父GDataXMLElement對象
for (GDataXMLElement *stuElement in stuArrayElement) {
//找到溫度的那一項
if ([[stuElement name] isEqualToString:@"forecast"]) {
//每一天的溫度
for (GDataXMLElement *stuSubElement in stuElement.children) {
//找到今天的天氣
if ([[stuSubElement stringValue] containsString:[[[MethodTool shareTool] getNowDate] substringFromIndex:8]]) {
NSMutableDictionary *weatherDic =[[NSMutableDictionary alloc]initWithCapacity:0];
for (GDataXMLElement *smallData in stuSubElement.children) {
#weather 中的子值
if ([[smallData name]isEqualToString:@"high"]) {
[weatherDic setValue:[[smallData.stringValue componentsSeparatedByString:@" "]lastObject]
forKey:@"tem2"];
}
else if ([[smallData name]isEqualToString:@"low"]){
[weatherDic setValue:[[smallData.stringValue componentsSeparatedByString:@" "]lastObject]
forKey:@"tem1"];
}
else if ([[smallData name]isEqualToString:@"day"]){
for (GDataXMLElement *tianqi in smallData.children) {
if ([tianqi.name isEqualToString:@"type"]) {
[weatherDic setValue:tianqi.stringValue forKey:@"title"];
}
}
}
}
successBlock(weatherDic);
break ;
}
}
break;
}
}
打?。簊tuArrayElement

由此可以 GDataXMLNode 是把 XML數(shù)據(jù)樹化,然后使用 結(jié)點的方式,逐層獲取對應(yīng)層級的 值。知道了 GDataXMLNode 解析XML數(shù)據(jù)的原理,我們即可熟練使用并解析出自己需要的數(shù)據(jù)了。