网络解析
1、xml解析--系统的SAX解析,逐行
在 Build Phases中 Link Binary With Libraries 添加 libxml2.tbd,同时Build Settings 中搜索 header search paths 添加/usr/include/libxml2
①遵循NSXMLParserDelegate协议
②
1 //1、获取文件路径 2 NSString *path = [[NSBundle mainBundle]pathForResource:@"XML" ofType:@"txt"]; 3 4 //2、通过路径创建一个data对象 5 NSData *data = [NSData dataWithContentsOfFile:path]; 6 7 //3、创建SAX解析使用的对象 8 NSXMLParser *xmlParser = [[NSXMLParser alloc]initWithData:data]; 9 10 //4、遵循代理; 11 xmlParser.delegate = self; 12 13 //5、开始解析 14 [xmlParser parse];
③
#pragma mark ---NSXMLParserDelegate 方法--- //1、开始解析XML文档 - (void)parserDidStartDocument:(NSXMLParser *)parser{ //准备数据(自动根据数组元素个数开辟空间最好先给0) self.dataArray = [NSMutableArray arrayWithCapacity:0]; } //2、开始解析标签的方法 /** * @param parser 类 * @param elementName 标签名 * @param namespaceURI <#namespaceURI description#> * @param qName <#qName description#> * @param attributeDict <#attributeDict description#> */ - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{ //获取到当前正在解析的标签,给标签属性赋值 _currentElement = elementName; //如果当前解析到的标签值为“student”(model预建立) if ([elementName isEqualToString:@"student"]) { //创建并初始化model,并添加到数据源 Student *stu = [Student new]; [self.dataArray addObject:stu]; } } //3、循环读取标签的值:这个方法,得到节点里面存的信息数据 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ //将值存入model类对应的属性中,循环执行,需要取最后一个【包<student></student>是按照顺序扔进数组的,挨个进行取值,所有只取最后一个,说明全部取完】 Student *stu = self.dataArray.lastObject; //根据当前已经解析出来的标签取到跟stu中属性对应的值,赋值给stu中的属性 [stu setValue:string forKey:_currentElement]; } //4、结束标签解析 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ //没有标签,解析结束 _currentElement = nil; } //5、结束解析文档 - (void)parserDidEndDocument:(NSXMLParser *)parser{ for (Student *stu in self.dataArray) { NSLog(@"%@",stu); } } //6、错误报告 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{ NSLog(@"错误报告 %@",parseError); }
2、XML_DOM解析
在 Build Phases中 Link Binary With Libraries 添加 libxml2.tbd,同时Build Settings 中搜索 header search paths 添加/usr/include/libxml2 另外:Build Phases 中 Compile Sources找到第三方GDataXMLNode.m文件,右侧添加-fno-objc-arc
让其在ARC下运行
①引入第三方GDataXMLNode文件
②
//1、获取文件路径 NSString *path = [[NSBundle mainBundle]pathForResource:@"XML" ofType:@"txt"]; //2、以data类型进行解析,将文件读入到data中 NSData *data = [NSData dataWithContentsOfFile:path]; //3、创建GDataXMLDocument 对象,此时XML文档内的所有节点,以树的形式存在于GDataXMLDocument 对象中 GDataXMLDocument *xmlDocument = [[GDataXMLDocument alloc]initWithData:data options:0 error:nil]; //4、获取XML文档的根节点对象,根节点里包含了XML文档的所有内容 GDataXMLElement *RootElement = [xmlDocument rootElement]; //5、创建解析出来的学生数组 self.dataArray = [NSMutableArray array]; //遍历根节点<students>的所有子节点<student> for (GDataXMLElement *subElement in RootElement.children) { Student *stu= [Student new]; //再遍历子节点<student>下的子标签<name><zi><say><weapon>取出子标签的内容,赋值给stu for (GDataXMLElement *contactElement in subElement.children) { /* //第一种赋值方法 if ([contactElement.name isEqualToString:@"name"]) { stu.name = contactElement.stringValue; }else if([contactElement.name isEqualToString:@"zi"]){ stu.zi = contactElement.stringValue; }else if ([contactElement.name isEqualToString:@"say"]){ stu.say = contactElement.stringValue; }else if ([contactElement.name isEqualToString:@"weapon"]){ stu.weapon = contactElement.stringValue; } */ //使用KVC对stu整个赋值 第二种赋值方法 [stu setValue:contactElement.stringValue forKeyPath:contactElement.name]; } //将赋值后的model类放入数据源数组 [self.dataArray addObject:stu]; } for (Student *stu in self.dataArray) { NSLog(@"%@",stu); }
3、JSON-系统Foundation框架解析
①
NSString *path = [[NSBundle mainBundle]pathForResource:@"JSON" ofType:@"txt"];//路径 NSData *data = [NSData dataWithContentsOfFile:path];//数据对象 /** * 放入数据对象源(NSData对象) * * @param NSJSONReadingOptions NSJSONReadingMutableContainers 表示解析完成后返回值类型为NSMutableArray NSJSONReadingMutableLeaves 表示解析完成后返回值类型是NSMutableString NSJSONReadingAllowFragments 允许JSON串最外层既不是数组也不是字典,但必须是JSON有效片段 * * @return 数组 */ NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; self.dataArray = [NSMutableArray array]; //遍历 for (NSDictionary *dic in array) { //初始化model Student *stu = [Student new]; [stu setValuesForKeysWithDictionary:dic]; [self.dataArray addObject:stu]; } for (Student *stu in self.dataArray) { NSLog(@"%@",stu); }
4、JSON-第三方Kit包解析
Build Phases 中 Compile Sources找到第三方JSONKit.m文件,右侧添加-fno-objc-arc
让其在ARC下运行
①引入第三方JSONKit包
②
//1、获取路径 NSString *path = [[NSBundle mainBundle]pathForResource:@"JSON" ofType:@"txt"]; //2、创建data对象 NSData *data = [NSData dataWithContentsOfFile:path]; //3、获取数据 NSArray *array = [data objectFromJSONData]; self.dataArray = [NSMutableArray array]; for (NSDictionary *dic in array) { Student *stu = [Student new]; [stu setValuesForKeysWithDictionary:dic]; [self.dataArray addObject:stu]; } for (Student *stu in self.dataArray) { NSLog(@"%@",stu); }