iOS进阶(XML、JSON数据解析)
1.XML解析之DOM解析
需要用到libxml2.dylib框架 和GDataXMLNode工具
DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中。从而消耗很大的内存空间。DOM可以读取XML也可以向XML文件中插入数据,而SAX却只能对XML进行读取,而不能在文件中插入数据
//获取XML文件路径 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"xml"]; //从文件路径中提取文档数据 NSData *data = [NSData dataWithContentsOfFile:filePath]; //这行代码执行完之后,我们队xml文档的解析已经成功了,在document中保存的是xml文档的版本号,编码格式,根节点,叶节点等所有文档信息,我们想要的数据,只要对document进行处理就可以拿到 GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil]; //XML数据的读取是以栈的形式管理的 //从xml格式的数据获取模型的方法 /* for (GDataXMLElement *element in array) { Person *person = [[Person alloc] init]; for (GDataXMLElement *element1 in [element children]) { [person setValue:[element1 stringValue] forKey:[element1 name]]; } [mArr addObject:person]; } /* //获取瘪犊子 //1,在document找到根节点对象 GDataXMLElement *root = document.rootElement; //获取根节点下所有的子节点对象 NSArray *array = [root children]; //获取目标数据所在的节点对象 GDataXMLElement *teacher = [array objectAtIndex:1]; //获取目标对象的所有子节点 NSArray *arr = [teacher children]; //取出结果 NSLog(@"%@",[arr[0] stringValue]); */ /* //获取瘪犊子 //第二种 GDataXMLElement *root = document.rootElement; NSArray *array = [root elementsForName:@"Teacher"]; NSLog(@"array is %@",array); NSArray *arr = [array[1] elementsForName:@"name"]; NSLog(@"%@",[arr[0] stringValue]); */ /* //获取瘪犊子 //第三种(通过节点路径找到具体某个内容) //(1)从document触发,绝对路径 NSArray *array = [document nodesForXPath:@"Teachers/Teacher/name" error:nil]; NSLog(@"%@",[array[1] stringValue]); //(2)从根节点出发 NSArray *array1 = [document.rootElement nodesForXPath:@"Teacher/name" error:nil]; NSLog(@"%@",[array1[1] stringValue]); //(3)从document出发,相对路径 NSArray *array2 = [document nodesForXPath:@"//name" error:nil]; NSLog(@"%@",[array2[1] stringValue]);*/
2.XML解析之SAX解析
采用协议回调机制,逐行进行解析
NSString *path = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"xml"]; NSData *data1 = [NSData dataWithContentsOfFile:path]; NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data1]; //既然SAX解析是基于时间回调机制的,所以需要指定解析器的代理 //实现代理方法 parser.delegate = self; [parser parse]; NSLog(@"%@",document); //开标签--内容--闭标签--内容--开标签--内容--闭标签 //遇见开标签执行的方法 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ NSLog(@"%@的开标签",elementName); } //遇见节点携带的内容是执行的方法 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ NSLog(@"%@",string); } //遇见闭标签是执行的方法 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ NSLog(@"%@的闭标签",elementName); }
3.JSON数据解析
//获取文件路径 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"movie" ofType:@"txt"]; //获取数据 NSData *data = [NSData dataWithContentsOfFile:filePath]; // self.dataArray = [NSMutableArray arrayWithCapacity:0]; //用懒加载代替 //开始解析(最外面是声明就用什么接收) NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:nil]; for (NSDictionary *dic in array) { NSArray *resultArray = dic[@"data"]; NSMutableArray *mArr = [NSMutableArray arrayWithCapacity:0]; for (NSDictionary *dictionary in resultArray) { Movie *movie = [[Movie alloc] init]; [movie setValuesForKeysWithDictionary:dictionary]; [mArr addObject:movie]; } [self.dataDic setObject:mArr forKey:dic[@"title"]]; } NSLog(@"dataDic is %@",self.dataDic);