XML資料解析

weixin_34148340發表於2016-06-04

解析來自伺服器返回的XML資料,介紹兩種方式:
1,NSXMLParser解析器 : SAX方式解析(從根元素開始,按順序一個一個的解析,適合解析大檔案);
2,GDataXML : DOM方式解析(一次性將整個XML文件載入進記憶體,適合解析小的檔案);

1 NSXMLParser

1, 確認請求路徑

NSURL *url = [NSURL URLWithString:@"xxx"];

2, 建立會話物件

NSURLSession *session = [NSURLSession sharedSession];

3, 建立請求Task

NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:
^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //建立XML解析器 NSXMLParser(SAX---從根元素一個元素一個元素的解析)
        NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
        //設定代理
        parser.delegate = self;
        //開始解析(同步是會阻塞當前執行路徑)
        [parser parse];
}];

4,執行Task

[dataTask resume];

5,代理方法

//1.當開始解析整個XML文件的時候回撥用
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    NSLog(@"parserDidStartDocument");
}

//2.開始解析某個元素的時候呼叫(呼叫多次)
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:
(NSDictionary<NSString *,NSString *> *)attributeDict
{
    NSLog(@"didStartElement %@元素開始解析--%@",elementName,attributeDict);
}

//3.某個元素解析完畢的時候呼叫
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"didEndElement--%@元素解析完畢",elementName);
}

//4.整個XML文件解析完畢的時候呼叫
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSLog(@"parserDidEndDocument");
}

2 GDataXML

使用此方法解析,需先匯入一個框架:GDataXML,接著按照框架註釋配置編譯器


2172969-e3f72d64d225e766.png
Snip20160604_4.png

2172969-0b0d72212cad6979.png
Snip20160604_2.png

GDataXML框架是MRC的,所以還需要告訴編譯器以MRC的方式處理GDataXML的程式碼


2172969-a433a60d52130db9.png
Snip20160604_3.png

1, 確認請求路徑
NSURL *url = [NSURL URLWithString:@"xxx"];

2, 建立會話物件

NSURLSession *session = [NSURLSession sharedSession];

3, 建立請求Task

NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:
^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//載入XML文件
        GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data options:0 error:nil];
//獲得根元素  得到根元素內部所有名字為abc的子元素
        NSArray *eles = [doc.rootElement elementsForName:@"abc"];
}];

4,執行Task

[dataTask resume];