關於iOS解析XML使用NSXMLParser和GDataXML不得不說的一些事

Isabella_Q發表於2015-07-07
  1. NSXMLParser
    最近剛學習iOS,需要解析一個XML如下:http://wthrcdn.etouch.cn/WeatherApi?citykey=101050101,最開始選擇使用自帶的NSXMLParser,首先,NSXMLParser必須繼承NSXMLParserDelegate協議
@interface ...   : ...  <NSXMLParserDelegate>

然後就是要初始化啦,
- (void)viewDidLoad {
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];//設定XML資料
[parser setDelegate:self];
[parser parse];
}

(1)遍例xml的節點,是所有的節點

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
}

(2)當xml節點有值時,則進入,用來取出<a></a>之間的值

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
}

(3)當遇到結束標記時,進入,用來儲存上述(2)取得值,

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
}

在遍歷結束前,會反覆執行上述三個方法,但是在解析的過程中,出現了一個問題,就是數字和文字分離的情況,比如,2級,解析的結果是2和級而不是2級,最終也沒弄明白事什麼原因,隨後又換了GDataXML,就沒有這個問題了。

2.GDataXML
GDataXMLNode是Google提供的用於XML資料處理的類集。該類集對libxml2–DOM處理方式進行了封裝,能對較小或中等的xml文件進行讀寫操作且支援XPath語法。
(1)獲取GDataXMLNode.h/m檔案,將GDataXMLNode.h/m檔案新增到工程中
(2)工程中增加“libxml2.dylib”庫
(3)在工程的“Build Settings”頁中找到“Header Search Path”項,新增/usr/include/libxml2”到路徑中,在Linking中找到 Other Linker Flags 對應的值改為:-lxml2。
(4)新增“GDataXMLNode.h”檔案到標頭檔案中
首先,初始化GDataXMLDocument,在定義根元素,以及根元素下一層的孩子元素

- (void)viewDidLoad
{
    NSString *path = [NSString stringWithFormat:@"http://wthrcdn.etouch.cn/WeatherApi?citykey=101050101"];
    NSURL *url = [[NSURL alloc] initWithString:path];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSData *urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    GDataXMLDocument *xmlDoc = [[GDataXMLDocument alloc] initWithData:urlData options:0 error:nil];
    GDataXMLElement *xmlEle = [xmlDoc rootElement];  //根元素 resp
    NSArray *array = [xmlEle children];//孩子元素city,updatetime...
    [self parseXml:array];   
}

然後就是層層迴圈巢狀的過程啦

-(void) parseXml:(NSArray *)array
{
    for (int i = 0; i<[array count]; i++) {
        GDataXMLElement *ele = [array objectAtIndex:i];
        if([[ele name] isEqualToString:@"city"])
           ...
        else if ([[ele name] isEqualToString:@"forecast"]) {
            GDataXMLDocument *weatherxml = [[GDataXMLDocument alloc]initWithRootElement:ele];
            GDataXMLElement *weatherxmlele = [weatherxml rootElement];//根元素 forecast
            NSArray *weatherarray = [weatherxmlele children];//孩子元素 weather
            for(int j = 0;j<[weatherarray count];j++)
       }
    }
}

GDataXML的方式很容易理解,就是在不停巢狀的時候對跟和孩子不要弄暈就好啦!本人才疏學淺,有不對的地方還忘批評指正!

版權宣告:本文為博主原創文章,未經博主允許不得轉載。

相關文章