1.XML简介:
它是一种可扩展标记语言
用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言
易读性高,编码手写难度小,数据量大
2.XML的两种解析方式
1 SAX(Simple API for XML)
只能读,不能修改,只能顺序访问,适合解析大型XML,解析速度快
常应用于处理大量数据的XML,实现异构系统的数据访问,实现跨平台
从文档的开始通过每一节点移动,定位一个特定的节点
2 DOM(Document Object Model)
不仅能读,还能修改,而且能够实现随机访问,缺点是解析速度慢,适合解析小型文档
一般应用与小型的配置XML,方便操作
为载入到内存的文档节点建立类型描述,呈现可横向移动、潜在巨大的树型结构
在内存中生成节点树操作代价昂贵
iOS的NSXMLParser是SAX方法解析
3.解析过程:
1. 创建NSXMLParser实例,并传入从服务器接收的XML数据
2. 定义解析器代理
3. 解析器解析
4. 通过解析代理方法完成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]; }原文链接:/xml/299128.html