网络数据解析-JSON&XML Veröffentlicht am 2013-12-14 ##JSON123456NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];NSArray *videoArray = dict[@"videos"];for (NSDictionary *videoDict in videoArray) { HMVideo *video = [HMVideo videoWithDict:videoDict]; [self.videos addObject:video];} ##XML—GDataXML (DOM 方式)DOM 方式直接读取整个文档12345678910111213141516171819202122232425262728293031323334353637383940414243444546/** 加载服务器最新的视频信息 */// 1.创建URLNSURL *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 SAX 方式SAX 是一条一条读取 XML 语句, 用在 XML 文件比较大的场景12345678910111213141516171819202122232425262728293031/** 加载服务器最新的视频信息 */// 1.创建URLNSURL *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];}]; 12345678910111213141516171819202122232425262728293031323334353637383940#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];}/** * 解析到一个元素的结束就会调用 * * @param elementName 元素名称 */- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{// NSLog(@"didEndElement----%@", elementName);}/** * 解析到文档的结尾时会调用(解析结束) */- (void)parserDidEndDocument:(NSXMLParser *)parser{// NSLog(@"parserDidEndDocument----");}