首页 > 代码库 > IOS开发使用NSXMLParser、GDataXML两种方式解析XML数据

IOS开发使用NSXMLParser、GDataXML两种方式解析XML数据

概括:XML数据解析方式有

*IOS原生的NSXMLParser,只支持SAX方式解析,使用简单

*C语言的libxml2,同时支持DOM和SAX方式解析

*google的GDataXML,只支持DOM方式解析,基于libxml2,使用时需要将编译环境配置为非ARC,并添加libxml2.dylib动态库

 

GDataXMLDocument


1 使用GDataXML的DOM方式解析XML,需要导入#import "GDataXMLNode.h"

/**

 *  DOM方式解析XML数据

 *  预先知道XML数据的结构

 */

-(void) analysisXMLByDOM{

    // 获取URL

    NSURL *url = [[NSURL alloc] initWithString:@"http://localhost:8070/MJServer/video?type=XML"];

    

    // 获取session的实例

    NSURLSession *session = [NSURLSession sharedSession];

    

    // 创建一个数据访问任务

    NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        // 如果访问错误

        if (error || data =http://www.mamicode.com/= nil) {

            NSLog(@"网络繁忙,请稍后再试");

            return;

        }

        

        // 加载整个XML数据

        GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];

        

        // 获取xml数据的根元素

        GDataXMLElement *root = [doc rootElement];

        

        // 取出根元素下的所有video节点元素

        NSArray *videos = [root elementsForName:@"video"];

        

        // 遍历数组取出数据

        for (GDataXMLElement *element  in videos) {

            NSLog(@"id -- %@", [element attributeForName:@"id"].stringValue);

            NSLog(@"name -- %@", [element attributeForName:@"name"].stringValue);

            NSLog(@"url -- %@", [element attributeForName:@"url"].stringValue);

            printf("\n----------------华丽丽的分割线-----------------\n");

        }

        

    }];

    

    [task resume];

}

 

2 使用NSXMLParser的SAX方式解析XML

/**

 *  DOM方式解析XML数据

 *  预先知道XML数据的结构

 */

-(void) analysisXMLByDOM{

    // 获取URL

    NSURL *url = [[NSURL alloc] initWithString:@"http://localhost:8070/MJServer/video?type=XML"];

    

    // 获取session的实例

    NSURLSession *session = [NSURLSession sharedSession];

    

    // 创建一个数据访问任务

    NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        // 如果访问错误

        if (error || data =http://www.mamicode.com/= nil) {

            NSLog(@"网络繁忙,请稍后再试");

            return;

        }

        

        // 加载整个XML数据

        GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];

        

        // 获取xml数据的根元素

        GDataXMLElement *root = [doc rootElement];

        

        // 取出根元素下的所有video节点元素

        NSArray *videos = [root elementsForName:@"video"];

        

        // 遍历数组取出数据

        for (GDataXMLElement *element  in videos) {

            NSLog(@"id -- %@", [element attributeForName:@"id"].stringValue);

            NSLog(@"name -- %@", [element attributeForName:@"name"].stringValue);

            NSLog(@"url -- %@", [element attributeForName:@"url"].stringValue);

            printf("\n----------------华丽丽的分割线-----------------\n");

        }

        

    }];

    

    [task resume];

}

 

/**

 *  SAX方式解析XML数据

 *  预先知道XML数据的结构

 */

-(void) analysisXMLBySAX{

    // 获取URL

    NSURL *url = [[NSURL alloc] initWithString:@"http://localhost:8070/MJServer/video?type=XML"];

    

    // 获取session的实例

    NSURLSession *session = [NSURLSession sharedSession];

    

    // 创建一个数据访问任务

    NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        // 如果访问错误

        if (error || data =http://www.mamicode.com/= nil) {

            NSLog(@"网络繁忙,请稍后再试");

            return;

        }

        

        // 创建解析器

        NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

        

        // 设置解析器的代理为当前控制器

        parser.delegate = self;

        

        // 开始解析

        [parser parse];

    }];

 

    [task resume];

}

 

#pragma mark - NSXMLParserDelegate的代理方法

 

// 解析到文档开始

-(void)parserDidStartDocument:(NSXMLParser *)parser{

    NSLog(@"parserDidStartDocument");

}

 

// 解析到元素开始

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

    NSLog(@"didStartElement");

    // 解析到video元素

    if ([@"video" isEqualToString:elementName]) {

        NSLog(@"id -- %@", attributeDict[@"id"]);

        NSLog(@"name -- %@", attributeDict[@"name"]);

        NSLog(@"url -- %@", attributeDict[@"url"]);

        printf("\n----------------华丽丽的分割线-----------------\n");

    }

}

 

// 解析到元素结束

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

    NSLog(@"didEndElement");

}

 

// 解析到文档结束

-(void)parserDidEndDocument:(NSXMLParser *)parser{

    NSLog(@"parserDidEndDocument");

}

IOS开发使用NSXMLParser、GDataXML两种方式解析XML数据