解析XML

最后更新于:2022-04-01 14:25:19

由于我们搭建好了Apache服务器,那么我们接下来看一下如何解析服务器返回的xml文件 虽然开发中,服务器返回的xml格式的数据较少,但是偶尔还是会有的。 由于解析xml没有比较好的第三方框架,所以我们还是乖乖的苦逼的写代码,虽然说,代码没有难度 xml数据: ~~~ <videos> <video videoId="1"> <name>张三</name> <teacher>张老师</teacher> </video> </videos> ~~~ 首先从服务器获取回来数据先 ~~~ NSURL *url = [NSURL URLWithString:@"http://localhost/videos.xml"]; NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:10.0]; [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { //创建xml解析器 NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data]; //设置代理 parser.delegate = self; //开始解析 [parser parse]; }]; ~~~ 我们依次的看一下我们要用到的代理方法 **开始解析调用(只会调用一次)** ~~~ - (void)parserDidStartDocument:(NSXMLParser *)parser { NSLog(@"1.开始文档"); } ~~~ **每发现一个开始节点就调用** ~~~ /** * 每发现一个节点就调用 * * @param parser 解析器 * @param elementName 节点名字 * @param attributeDict 属性字典 */ * (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict { NSLog(@"2.发现节点:%@",elementName); if ([elementName isEqualToString:@"video"]) { //创建模型对象 self.video = [[ZYVideo alloc]init]; } [self.elementNameString setString:@""]; } ~~~ **发现节点内容** ~~~ - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { NSLog(@"3.发现节点内容:%@",string); //把发现的内容进行拼接 [self.elementNameString appendString:string]; } ~~~ **发现结束节点** ~~~ - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName { NSLog(@"3.发现结束节点 %@",elementName); // NSLog(@"拼接的内容%@",self.elementNameString); if ([elementName isEqualToString:@"name"]) { self.video.name = self.elementNameString; }else if ([elementName isEqualToString:@"teacher"]) { self.video.teacher = self.elementNameString; } } ~~~ **解析完毕调用** ~~~ - (void)parserDidEndDocument:(NSXMLParser *)parser { NSLog(@"解析完毕---------"); NSLog(@"%@",self.video); } ~~~ 提前做好的懒加载: ~~~ #pragma mark - 懒加载 - (NSMutableString *)elementNameString { if (_elementNameString == nil) { _elementNameString = [[NSMutableString alloc]init]; } return _elementNameString; } ~~~ 搞定:看结果: ![解析XML](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-07_5706110286e08.jpg "")
';