iOS讲解迷惑深入浅出之SAX解析和JSON 解析
2015-09-15 14:49
239 查看
XML的SAX解析
NSXMLParser 分析XML文件
XML格式的DOM解析
json解析
JSON 数据结构, 99%的公司都在用, 用系统再带的json解析, 不要用jsionkit
NSXMLParser 分析XML文件
<span style="font-size:14px;">- (void)setUpDataXMLParser { // 3. 创建路径 NSString *path = [[NSBundlemainBundle]pathForResource:@"Student"ofType:@"xml"]; // 2. NSData存储数据,以二进制形式存储 NSData *data = [NSDatadataWithContentsOfFile:path]; // 1. 创建一个分析人 类 NSXMLParser *parser = [[NSXMLParseralloc]initWithData:data]; // 设置代理 parser.delegate = self; // 开始分析(利用协议方法,进行分析,去遵守协议NSXMLParserDelegate) [parser parse]; // 释放分析人 [parser release]; NSLog(@"我在这里释放行吗?"); } /** * 执行顺序: 1. 开始分析: [parser parse]; // 开始代理方法的实现 1. 开始分析文件 2. 开始遇到节点 3. 发现字符 4. 结束遇到节点 5. 结束分析文件 */ /***************************************************************/ /** * 把XML数据保存到model需要的操作 1. 把数据取出来 2. 装进model 3. 把model装进数组,备用 1. 从什么位置初始化数组:开始分析文件位置 2. 从什么位置初始化model:开始遇到节点 // 从什么位置可以拿出数据: 4.发现字符 3. 从什么位置给model赋值: 5.结束节点 4. 从什么位置可以打印出数组: 已经结束分析文件(最后执行) */ #pragma mark - NSXMLParser代理方法 // 1. 已经开始分析文件 (最先执行),这个方法值只走一次 // 在这个方法里面初始化数组 - (void)parserDidStartDocument:(NSXMLParser*)parser { // 初始化数组 self.dataArray= [NSMutableArrayarray]; NSLog(@"已经开始分析文件"); } // 2. 已经结束分析文件 (最后执行) // - (void)parserDidEndDocument:(NSXMLParser*)parser { NSLog(@"已经结束分析文件"); NSLog(@"%@",self.dataArray); } // 3. 开始遇到节点 // 初始化model - (void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName attributes:(NSDictionary*)attributeDict { // 初始化model // Student 是内层的节点, // self.model 这个model是在本类中声明的 if ([elementName isEqualToString:@"Student"]) { self.model= [[StudentModelalloc]init]; } //NSLog(@"开始遇到节点"); NSLog(@"<%@>", elementName);//节点名字 } // 4. 发现字符, 逐行发现 // 拿出数据 - (void)parser:(NSXMLParser*)parser foundCharacters:(NSString*)string { // 保存字符串 , self.string也是被类声明的 nsstring类型的 self.string= string;// string就是<></>之间的内容 // NSLog(@"发现字符"); NSLog(@"string: %@", string); } // 5. 结束节点 // 给model赋值 - (void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName { // 给model赋值 if ([elementNameisEqualToString:@"name"]) {//如果节点的名字等于 self.model.name=self.string; } else if ([elementName isEqualToString:@"gender"]) { self.model.gender=self.string; } else if ([elementName isEqualToString:@"age"]) { self.model.age=self.string; } else if ([elementName isEqualToString:@"motto"]) { self.model.motto=self.string; } else if ([elementName isEqualToString:@"Student"]) { // 节点等于Student的时候一个model就赋值完成了,可以装进数组了 [self.dataArrayaddObject:self.model]; [_model release]; //装进数组后就可以释放了 } //NSLog(@"遇到节点结束触发"); NSLog(@"</%@>", elementName); } </span>
XML格式的DOM解析
<span style="font-size:14px;">/******************** Dom解析 一次性解析完成 **************************/ // Dom解析 // 使用 GDataXmlNode这个类库来实现(第三方类库, 谷歌写的类库) // 直接导入类库报错 // 报错原因: GDataXmlNode 基于 libxml来写的,所以必须把libxml框架导入工程里面 - (void)setUpDataGDataXmlNode { // 创建路径 NSString *path = [[NSBundlemainBundle]pathForResource:@"Student"ofType:@"xml"]; // 转换成NSData NSData *data =[NSDatadataWithContentsOfFile:path]; // 利用XMLNode类进行Dom解析 // 用data初始化管理文件的对象,转化成树形结构 // <#(NSError **)#> 如果解析失败可以打印出理由, 需要传入&error NSError *error =nil; GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:dataoptions:0error:&error]; // 2. 获取根节点 GDataXMLElement *rootElement = [document rootElement]; //NSLog(@"%@", rootElement); // 3. 获取根节点下Student节点(Student 下面有好多Student节点, 获取气候放到数组里面) NSArray *stusArray = [rootElement elementsForName:@"Student"]; //NSLog(@"%@", stusArray); // 循环外面初始化一下数组 用来保存model self.dataArray= [NSMutableArrayarray]; // 遍历Student节点的数组 for (inti =0; i < stusArray.count; i++) { // 取出每一个Student节点 GDataXMLElement *oneStudentElement = stusArray[i]; // // // 取出oneStudentElement节点下的name的数组(这个数组里面存放的是节点,数据类型是GDataXMLElement类型) // NSArray *nameArray = [oneStudentElement elementsForName:@"name"]; // NSLog(@"nameArray: %@", nameArray); // // // 取出name节点, // GDataXMLElement *nameElement = [nameArray firstObject]; //第0个元素 // // // 转化为字符串 // NSString *name = [nameElement stringValue]; // NSLog(@"name: %@", name); // // // // // 取出oneStudentElement节点下的gender的数组 // NSArray *genderArray = [oneStudentElement elementsForName:@"gender"]; // // 取出gender节点 // GDataXMLElement *genderElement = genderArray[0]; // // 转化为字符串 // NSString *gender = [genderElement stringValue]; // NSLog(@"gender: %@", gender); // // // NSArray *ageArray = [oneStudentElement elementsForName:@"age"]; // GDataXMLElement *ageElement = ageArray[0]; // NSString *age = [ageElement stringValue]; // // NSArray *mottoArray = [oneStudentElement elementsForName:@"motto"]; // GDataXMLElement *mottoElement = [mottoArray firstObject]; // NSString *motton = [mottoElement stringValue]; // // 三次次调用封装的方法 NSString*name = [selfbackStringWithElement:oneStudentElementelementName:@"name"]; NSString *gender = [self backStringWithElement:oneStudentElement elementName:@"gender"]; NSString *age = [self backStringWithElement:oneStudentElement elementName:@"age"]; NSString *motto = [self backStringWithElement:oneStudentElement elementName:@"motto"]; // 给model赋值 // 初始化model StudentModel *model = [[StudentModel alloc] init]; model.name = name; model.gender = gender; model.age = age; model.motto = motto; // 把model装进数组 [self.dataArrayaddObject:model]; [model release]; } } // 封装的方法 返回节点中的字符串 - (NSString *)backStringWithElement:(GDataXMLElement*)element elementName:(NSString*)elementName { // 取出oneStudentElement节点下的name的数组 NSArray *nameArray = [elementelementsForName:elementName]; NSLog(@"nameArray: %@", nameArray); // 取出name节点 GDataXMLElement *nameElement = [nameArray firstObject];//第0个元素 // 转化为字符串 NSString *name = [nameElementstringValue]; return name; } /*********** Dom解析结束 *************************/ </span>
json解析
JSON 数据结构, 99%的公司都在用, 用系统再带的json解析, 不要用jsionkit
<span style="font-size:14px;">// JSON 解析数据 上面的教师的数据 - (void)setUpJson { // 获取路径 NSString *path = [[NSBundlemainBundle]pathForResource:@"Teacher"ofType:@"json"]; // 变成dada NSData *data = [NSDatadataWithContentsOfFile:path]; // 把data转化成可变数组或者可变字典(是字典还是数组,要看json最外层是什么) // NSJSONSerialization json使用的类 NSError *error =nil; NSMutableArray *dataArray = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainerserror:&error]; //NSLog(@"%@", dataArray); self.dataArray= [NSMutableArrayarray]; // 剥��香蕉 for (NSDictionary*dicin dataArray) { TeacherModel *model = [[TeacherModel alloc] init]; [model setValuesForKeysWithDictionary:dic]; [self.dataArrayaddObject:model]; [model release]; } NSLog(@"%@",self.dataArray); } [] // json解析城市数据 - (void)setUpDataJsonCity { NSString *path = [[NSBundlemainBundle]pathForResource:@"area"ofType:@"json"]; NSData *data = [NSDatadataWithContentsOfFile:path]; NSError *error =nil; // 把data转化成可变字典或数组,因为城市数据最外层是数组,所以用 NSMutableArray *dataArray = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainerserror:&error]; self.dataArray= [NSMutableArrayarray]; /******* JSONKIT 解析 *********/ // 导入第三方类库 //NSMutableArray *jsonKitArray = [data objectFromJSONData]; //等价于 上面的 NSJSONSerialization解析 /******** ************/ // 剥香蕉 // 遍历数组, 因为数组里面的元素类型是NSDictionary类型,所以遍历的时候是(NSDictionary *dic in dataArray) for (NSDictionary*dicin dataArray) { CityModel *model = [[CityModel alloc] init];//构建model [model setValuesForKeysWithDictionary:dic];//给model进行KVC赋值,把字典装进model [self.dataArrayaddObject:model];//把model装进数组 } }</span>
相关文章推荐
- iOS开发 字符串处理
- ios 调用系统提示音教程
- IOS 很多控件的讲解
- 通过iOS 9 SFSafariViewController提供完整的Web浏览体验
- iOS 运行问题
- iOS的文件分类、存放路径及文件属性
- ios开发系列之NSDate,NSDateFormatter,NSDateComponents和NSCalendar
- iOS各大牛博客
- 在ios中解析json数据
- 苹果操作系统(OS X和iOS)表情字符
- iOS疯狂详解之NSFileManager使用
- iOS疯狂详解之复杂对象归档反归档
- ios 数字加小数点键盘
- ios--socket
- iOS 学习资料整理
- 自定义的一个仿ios开关效果的SwitchButton
- ## 解决iOS消息列表显示时间的问题 ##
- iOS生成服务器端的推送证书
- IOS开发-CAlayer-锚点小结
- IOS 沙盒两种数据读取方式&NSUserDefaults读取方式