xml解析
1.XML简介: 它是一种可扩展标记语言 2.XML的两种解析方式 1 SAX(Simple API for XML) iOS的NSXMLParser是SAX方法解析 3.解析过程: 1. 创建NSXMLParser实例,并传入从服务器接收的XML数据 代码:
#pragma mark 解析XML - (void)loadXML { // 1. 从服务器获取数据 GET // 1) url NSURL *url = [NSURL URLWithString:@"http://192.168.3.251/~apple/itcast/videos.php?format=xml"]; // 2) request NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:2.0f]; // 3) 连接同步,可以让用户先有内容可看 NSError *error; // NSData存放的是二进制的数据 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error]; // 2. XML解析 // 1) 解析器 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; // 2) 设置代理 parser.delegate = self; // 3)开始解析 [parser parse]; } #pragma mark - XML解析方法 // 1. 开始解析文档,在这里做初始化工作 - (void)parserDidStartDocument:(NSXMLParser *)parser { NSLog(@"开始解析文档"); // 数组还没有被初始化,初始化数组 _dataList = [NSMutableArray array]; _elementString = [NSMutableString string]; } // 2.3.4会循环执行,一直到XML文档解析完毕 // 2. 解析一个节点 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { NSLog(@"节点开始 %@ %@",elementName,attributeDict); if ([elementName isEqualToString:@"video"]) { // 新建一个视频模型对象 _currentVideo = [[Video alloc] init]; // 取视频ID _currentVideo.videoId = [attributeDict[@"videoId"] integerValue]; } // 清空拼接字符串 [_elementString setString:@""]; } // 3. 查找节点内容,可能会多次 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { NSLog(@"开始查找内容 %@",string); // 拼接字符串 [_elementString appendString:string]; } // 4. 节点完成 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { NSLog(@"节点完成 %@ %p",_elementString); NSString *result = [NSString stringWithString:_elementString]; if ([elementName isEqualToString:@"video"]) { // 对象的属性填充完毕,添加到数组 [_dataList addObject:_currentVideo]; } else if ([elementName isEqualToString:@"length"]) { _currentVideo.length = [result integerValue]; } else if (![elementName isEqualToString:@"videos"]) { // 利用KVC给字符串类型的属性赋值 [_currentVideo setValue:result forKey:elementName]; } } // 5. 解析完成,做收尾工作 - (void)parserDidEndDocument:(NSXMLParser *)parser { NSLog(@"解析完成"); NSLog(@"%@",_dataList); } // 6. 解析出错,清理中间数据 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { NSLog(@"%@",parseError.localizedDescription); // 一旦解析发生错误,需要把解析过程中生成的记录全部清除,以免造成不必要的麻烦 [_dataList removeAllObjects]; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |