首页 > 代码库 > 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数据