网络篇----解析xml
1.xml 数据包括
文档声明:格式<?xml version="1.0" encoding="UTF-8" ?>
元素:<vidwo>小黄人</video> 包括开始标签和结束标签
2.xml 解析有两种方式
1.>DOM:一次性将整个xml文档加载到内存,比较适合解析小文件
2.>SAX:从根元素开始,安顺序一个元素一个元素往下解析,比较适合解析大文件
介绍两种常用的解析方法:
NSXMLParser :SAX方式解析,使用简单 ,这是苹果系统自带方法 即大文件使用
第三方框架:GDataXML:DOM方式解析,由google开发, 即小文件使用
由于GDataXML是基于lixml2,所以需要倒入此动态库
以下讲解GDataXML方式解析xml
// 1.创建URL NSURL *url = HMUrl(@"video?type=XML"); // 2.创建请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3.发送请求 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if (connectionError || data == nil) { [MBProgressHUD showError:@"网络繁忙,请稍后再试!"]; return; } // 解析XML数据 // 加载整个XML数据 GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil]; // 获得文档的根元素 -- videos元素 GDataXMLElement *root = doc.rootElement; // 获得根元素里面的所有video元素 NSArray *elements = [root elementsForName:@"video"]; // 遍历所有的video元素 for (GDataXMLElement *videoElement in elements) { HMVideo *video = [[HMVideo alloc] init]; // 取出元素的属性 video.id = [videoElement attributeForName:@"id"].stringValue.intValue; video.length = [videoElement attributeForName:@"length"].stringValue.intValue; video.name = [videoElement attributeForName:@"name"].stringValue; video.image = [videoElement attributeForName:@"image"].stringValue; video.url = [videoElement attributeForName:@"url"].stringValue; // 添加到数组中 [self.videos addObject:video]; } // 刷新表格 [self.tableView reloadData]; }]; }
NSXMLParser方式解析xml
// 1.创建URL NSURL *url = HMUrl(@"video?type=XML"); // 2.创建请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3.发送请求 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if (connectionError || data == nil) { [MBProgressHUD showError:@"网络繁忙,请稍后再试!"]; return; } // 解析XML数据 // 1.创建XML解析器 -- SAX -- 逐个元素往下解析 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; // 2.设置代理 parser.delegate = self; // 3.开始解析(同步执行) [parser parse]; // 4.刷新表格 [self.tableView reloadData]; }]; } #pragma mark - NSXMLParser的代理方法 /** * 解析到文档的开头时会调用 */ - (void)parserDidStartDocument:(NSXMLParser *)parser { // NSLog(@"parserDidStartDocument----"); } /** * 解析到一个元素的开始就会调用 * * @param elementName 元素名称 * @param attributeDict 属性字典 */ - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if ([@"videos" isEqualToString:elementName]) return; HMVideo *video = [HMVideo videoWithDict:attributeDict]; [self.videos addObject:video]; }