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 == 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 == 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 == 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"); }