iOS数据解析UI_14
提供数据方(后台):工作就是把数据按照一定的格式存储起来
提取数据方(前台):工作就是把数据按照一定的格式读取出来
主流的格式:XML格式 / JSON格式 ,此两种格式无论前台还是后台都必须熟悉
XML以标签的形式存在,标签由开始标签和结束标签,这一对标签就做节点;
没有父节点的节点叫做根节点,没有子节点的节点就做叶子节点,而我们要使用的数据都在叶子节点中存储;
XML解析的两种工作原理:
Student.h @interface Student : NSObject @property(nonatomic,copy)NSString *name;//姓名 @property(nonatomic,copy)NSString *gender;//性别 @property(nonatomic,copy)NSString *age;//年龄 @property(nonatomic,copy)NSString *says;//座右铭 @property(nonatomic,retain)NSString *position;//属性 @end Student.m @implementation Student -(void)dealloc{ self.name = nil; self.gender = nil; self.says = nil; self.age = nil; self.position = nil; [super dealloc]; } //防止未找到key值所对的value造成Crash - (void)setValue:(id)value forUndefinedKey:(NSString *)key{ } @end ————————————————— 两个方法的cell显示一样UITableViewCell SAXViewController.m #import "SAXViewController.h" #import "Student.h" @interface SAXViewController ()<NSXMLParserDelegate> //存储从xml中解析出来的学生对象 @property(nonatomic,retain)NSMutableArray *dataSource; @property(nonatomic,retain)Student *student;//存储使用学生对象读取到的信息 @property(nonatomic,retain)NSMutableString *string;//存储读取到节点中的数据 @end @implementation SAXViewController - (void)dealloc{ self.dataSource = nil; self.student = nil; self.string = nil; [super dealloc]; } - (IBAction)handleParser:(UIBarButtonItem *)sender { //NSXMLParser 系统提供的解析xml文件的类 //第一步:获取文件路径 NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Students.xml" ofType:nil]; //第二步:创建解析对象 //创建一个NSData对象 NSData *data = [NSData dataWithContentsOfFile:filePath]; NSXMLParser *parser =[[NSXMLParser alloc]initWithData:data]; //制定代理 parser.delegate = self; //开始解析 [parser parse]; //释放 [parser release]; } - (NSMutableArray *)dataSource{ if (_dataSource == nil) { self.dataSource = [NSMutableArray arrayWithCapacity:0]; } return [[_dataSource retain]autorelease]; } #pragma mark xmlPoarserDelegate 代理方法 //开始解析的时候触发这个方法 - (void)parserDidStartDocument:(NSXMLParser *)parser{ // NSLog(@"开始解析了"); //开始解析的时候清空数组中的内容 [self.dataSource removeAllObjects]; } //读到开始标签的时候开始触发 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ //当读取到Student开始标签的时候创建学生对象 if ([elementName isEqualToString:@"Student"]) { self.student = [[Student alloc]init]; self.student.position = attributeDict[@"position"]; } //读取到开始标签就初始化字符串self.string self.string = [NSMutableString stringWithCapacity:0]; } //读到结束标签的时候开始触发 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ if ([elementName isEqualToString:@"name"]) { self.student.name = self.string; }else if([elementName isEqualToString:@"age"]){ self.student.age = self.string; }else if([elementName isEqualToString:@"gender"]){ self.student.gender = self.string; }else if ([elementName isEqualToString:@"says"]){ self.student.says = self.string; }else if ([elementName isEqualToString:@"Student"]){ //把学生对象添加到数组中 [self.dataSource addObject:self.student]; [self.student release]; } } //当读到开始标签后的数据触发 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ //string 存储的就是读到的数据 //由于系统的解析能力是有限的,如果节点中的内容过长,不能一次性全部读取,此时要把,每次读取到的内容拼接在一起 [self.string appendString:string]; } //结束解析的时候触发 - (void)parserDidEndDocument:(NSXMLParser *)parser{ // NSLog(@"解析结束了"); //在这里让tableView重新刷新一下ui,重新走一遍数据源方法 [self.tableView reloadData]; } //返回分区个数 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } //返回行数 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataSource.count; } //显示 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"sax" forIndexPath:indexPath]; //根据cell的下标取出对应的学生 Student *s = self.dataSource[indexPath.row]; cell.textLabel.text = s.name; return cell; }
最终效果:
—————————————————————————————————————————————————— ————————————————第二部分Dom解析——————————————— 两个方法的cell显示一样UITableViewCell 2. GDataXMLNode 是由Google提供的开源的基于C语言的libxml2.dylib动态链接类库封装的OC xml解析类,效率比较高 使用GDataXMLNode 步骤: 1.target -->Build Phases--link Binary 添加libxml2.dylib 2.target -->Build setting 搜 header seach Path 双击后缀添加 /usr/include/libxml2 libxml2.dylib 和 libxml2.2dylib 的区别:前一个是快捷方式,永远指向最新的实体类库,而后一个才是真正的实体类库,使用前一个好处,当系统实体类库更新的时候,老版本的项目就无需再重新导入实体类库; DOMViewController.m #import "DOMViewController.h" #import "GDataXMLNode.h" #import "Student.h" @interface DOMViewController () @property(nonatomic,retain)NSMutableArray *dataSource; @end @implementation DOMViewController - (void)dealloc{ self.dataSource = nil; [super dealloc]; } //懒加载创建数组 - (NSMutableArray *)dataSource{ if (_dataSource == nil) { self.dataSource = [NSMutableArray arrayWithCapacity:0]; } return [[_dataSource retain]autorelease]; } ==============RootParser解析================= - (IBAction)handleRootParser:(UIBarButtonItem *)sender { //解析开始之前把数组中的元素清空 self.dataSource = nil; //拿到文件的路径 NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Students.xml" ofType:nil]; //将文件内容存储到字符串中 NSString *xmlStr = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; //将要解析的内容写入到GDataXMLDocument 类中 //第二个参数是一个预留参数,就是这个方法的作者,在写这个方法时预留一个参数的位置,留待以后对方的扩充 GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithXMLString:xmlStr options:0 error:nil]; // GDataXMLElement 节点类 // GDataXMLNode 属性类 //获取document 中所有的根节点 GDataXMLElement *rootElement = [document rootElement]; // NSLog(@"%@",rootElement);//验证 //获取根节点下的所有Student节点 NSArray *stuElements = [rootElement elementsForName:@"Student"]; // NSLog(@"%@",stuElement);//验证 //遍历数组,获取每一个Student节点 for (GDataXMLElement *stuElement in stuElements) { //获取Student节点下的name/age/gender/says 因为只有一个元素所有firstObject和lastObject一样 GDataXMLElement *nameElement = [[stuElement elementsForName:@"name"]lastObject]; GDataXMLElement *ageElement = [[stuElement elementsForName:@"age"]lastObject]; GDataXMLElement *genderElement = [[stuElement elementsForName:@"gender"]firstObject]; GDataXMLElement *saysElement = [[stuElement elementsForName:@"says"]firstObject]; /*//打印每个节点对象中的数据 验证! NSLog(@"%@",[nameElement stringValue]); NSLog(@"%@",[ageElement stringValue]); NSLog(@"%@",[genderElement stringValue]); NSLog(@"%@",[saysElement stringValue]); NSLog(@"________________________"); */ //创建学生对象,存储节点对象中的数据 Student *stu = [[Student alloc]init]; stu.name = [nameElement stringValue]; stu.age = [ageElement stringValue]; stu.gender = [genderElement stringValue]; stu.says = [saysElement stringValue]; //取出学生节点对象中的属性 GDataXMLNode *node = [stuElement attributeForName:@"position"]; stu.position = [node stringValue]; //将学生对象添加到数组织中 [self.dataSource addObject:stu]; [stu release]; } [self.tableView reloadData]; // NSLog(@"%@",self.dataSource); //验证 //释放xml文本对象 [document release]; }
RootParser解析效果:
———————————————————————————————————————————— ==============xPath相对路径解析================= - (IBAction)handleXPath:(UIBarButtonItem *)sender { //清空数组 [self.dataSource removeAllObjects]; //拿到文件的路径 NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Students.xml" ofType:nil]; //将文件内容存储到字符串中 NSString *xmlStr = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; //将要解析的内容写入到GDataXMLDocument 类中 //第二个参数是一个预留参数,就是这个方法的作者,在写这个方法时预留一个参数的位置,留待以后对方的扩充 GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithXMLString:xmlStr options:0 error:nil]; //通过相对路径获取name,age,gender,says 节点 //姓名节点 NSArray *nameElements = [document nodesForXPath:@"//name" error:nil]; //年龄节点 NSArray *ageElements = [document nodesForXPath:@"//age" error:nil]; //性别节点 NSArray *genderElements = [document nodesForXPath:@"//gender" error:nil]; //座右铭节点 NSArray *saysElements = [document nodesForXPath:@"//says" error:nil]; //学生节点 NSArray *studentElements = [document nodesForXPath:@"//Student" error:nil]; //求出学生节点数组中元素的个数 int count = (int)studentElements.count; for (int i = 0; i < count; i ++) { //创建节点对象接收数组中对应位置的元素 GDataXMLElement *nameElement = nameElements[i]; //取出年龄节点 GDataXMLElement *ageElement = ageElements[i]; //取出性别节点 GDataXMLElement *genderElement = genderElements[i]; //取出says节点 GDataXMLElement *saysElement = saysElements[i]; //取出学生节点 GDataXMLElement *studentElement = studentElements[i]; //创建学生对象存储节点中的内容 Student *s = [[Student alloc]init]; s.name = [nameElement stringValue]; s.age = [ageElement stringValue]; s.gender = [genderElement stringValue]; s.says = [saysElement stringValue]; //取出学生节点中的属性 GDataXMLNode *node = [studentElement attributeForName:@"position"]; s.position = [node stringValue]; //添加到数组中 [self.dataSource addObject:s]; //释放 [s release]; } //刷新UI界面 [self.tableView reloadData]; [document release]; } //返回分区 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataSource.count; } //显示 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"dom" forIndexPath:indexPath]; //取值给model类Student对象 Student *s = self.dataSource[indexPath.row]; //赋值 cell.textLabel.text = s.position; return cell; } xPath相对路径解析效果:
—————————————————————————————————————————————— =======================第三部分JiSON========================= 两个方法的cell显示一样UITableViewCell JSONViewController.m #import "JSONViewController.h" #import "Student.h" #import "JSONKit.h" @interface JSONViewController () @property(nonatomic,retain)NSMutableArray *dataSource; @end @implementation JSONViewController - (void)dealloc{ self.dataSource = nil; [super dealloc]; } //懒加载 - (NSMutableArray *)dataSource{ if (_dataSource == nil) { self.dataSource = [NSMutableArray arrayWithCapacity:0]; } return [[_dataSource retain]autorelease]; } ==============系统方法解析================= - (IBAction)handleSystomParser:(UIBarButtonItem *)sender { //清空字典内容 self.dataSource = nil; //1.获取文件路径 NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Student.json" ofType:nil]; //2.将JSON文件读取到Data对象中 NSData *date = [NSData dataWithContentsOfFile:filePath]; // NSJSONReadingMutableContainers = (1UL << 0), 返回容器是可变容器 // NSJSONReadingMutableLeaves = (1UL << 1), 返回的找到的数据的是可变的数据 //json的最外层是数组,所以用数组接收 NSMutableArray *dataSource = [NSJSONSerialization JSONObjectWithData:date options:(NSJSONReadingMutableContainers) error:nil]; //数组中都是字典,所以遍历字典 for (NSDictionary *dic in dataSource) { //创建一个学生对象 Student *stu = [[Student alloc]init]; //kvc赋值 [stu setValuesForKeysWithDictionary:dic]; //加到数组里 [self.dataSource addObject:stu]; //释放 [stu release]; } //刷新ui [self.tableView reloadData]; } 系统方法解析效果:
—————————————————————————————————— ==============第三方解析================= - (IBAction)handleThridParer:(UIBarButtonItem *)sender { //清除数组 self.dataSource = nil; //获取文件路径 NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Student.json" ofType:nil]; /*系统方法暂时不用(注掉) NSString *jsonStr = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; //1.通过json格式的字符串解析json数据 objectFromJSONString返回的数据可以使用可变容器接收也可以使用不可变容器接收 NSArray *dataArray = [jsonStr objectFromJSONString]; NSLog(@"%@",dataArray); */ 新方法 //2.通过NSDate对象完成解析 objectFromJSONData返回的数据可以使用可变容器接收也可以使用不可变容器接收 NSData *data = [NSData dataWithContentsOfFile:filePath]; NSArray *dataArray2 = [data objectFromJSONData]; // NSLog(@"%@",dataArray2); 验证! //数组中都是字典,所以遍历字典 for (NSDictionary *dic in dataArray2) { //创建 Student *stu = [[Student alloc]init]; [stu setValuesForKeysWithDictionary:dic]; [self.dataSource addObject:stu]; [stu release]; } [self.tableView reloadData]; } //返回分区 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } //返回行数 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataSource.count; } //显示 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"json" forIndexPath:indexPath]; //取值 Student *s = self.dataSource[indexPath.row]; //显示 cell.textLabel.text = s.says; return cell; } 第三方解析效果:
iOS数据解析UI_14的更多相关文章
- IOS数据解析JSON
//非原创 作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSO ...
- 【原】iOS学习38网络之数据解析
1. 解析的基本的概念 解析:从事先规定好的格式中提取数据 解析前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照格式获取数据 iOS开发常见的解析:XML解析.JOSN解析 2. X ...
- iOS - JSON 数据解析
iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...
- iOS开发笔记3:XML/JSON数据解析
这篇主要总结在iOS开发中XML/JSON数据解析过程用到的方法.XML数据解析主要使用SAX方式的NSXMLParser以及DOM方式的GDataXML,JSON数据解析主要使用NSJSONSeri ...
- iOS学习—JSON数据解析
关于在iOS平台上进行JSON解析,已经有很多第三方的开源项目,比如TouchJson,JSONKit,SBJon等,自从iOS5.0以后,苹果SDK推出了自带的JSON解决方案NSJSONSer ...
- iOS - Plist 数据解析
前言 NS_AVAILABLE(10_6, 4_0) @interface NSPropertyListSerialization : NSObject 如果对象是 NSArray 或 NSDicti ...
- iOS - XML 数据解析
前言 @interface NSXMLParser : NSObject public class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mar ...
- iOS GET、POST数据解析
在实际开发中,JSON数据解析更简单易行,一般均使用json数据解析,因此,程序猿们请务必和后台搞好关系,让他给你json数据. XML解析: ios SDK提供了NSXMLParser和lib ...
- 浅议iOS网络数据解析
/*------------------------------------ 数据解析: 1.JSON数据 --------------------------------*/ 重点:1.什么是JSO ...
随机推荐
- 传统方法过渡到ES6去优雅地实现JavaScript的继承
众所周知,面向对象编程有三个重要的概念: 封装.继承.多态.而JS作为面向对象的弱类型语言,应该说是基于对象的语言,正如常说的,JS的世界里,万物皆对象.虽然JS本身不是面向对象的语言,我们可以通过模 ...
- Linux的哲学思想
1.一切皆文件:2.单一目的的小程序:3.组合小程序完成复杂任务:4.文本文件保存配置信息:5.尽量避免捕获用户接口:6.提供机制,而非策略. 说到底Linux的哲学思想在于方便和更好的管理后台,不同 ...
- 解读Raft(二 选举和日志复制)
Leader election Raft采用心跳机制来触发Leader选举.Leader周期性的发送心跳(如果有正常的RPC的请求情况下可以不发心跳)包保持自己Leader的角色(避免集群中其他节点认 ...
- 利用Filter和拦截器,将用户信息动态传入Request方法
前言: 在开发当中,经常会验证用户登录状态和获取用户信息.如果每次都手动调用用户信息查询接口,会非常的繁琐,而且代码冗余.为了提高开发效率,因此就有了今天这篇文章. 思路: 用户请求我们的方法会携带一 ...
- Docker容器的运用
Docker 利用容器来运行应用. 容器是从镜像创建的运行实例.它可以被启动.开始.停止.删除.每个容器都是相互隔离的.保证安全的平台. 可以把容器看做是一个简易版的 Linux 环境(包括root用 ...
- Jmeter(二十)_Mock接口
首先解释一下什么是mock接口. Mock通常是指,在测试一个对象时,我们构造一些假的对象来模拟与其交互.而这些Mock对象的行为是我们事先设定且符合预期.通过这些Mock对象来测试对象在正常逻辑,异 ...
- Docker: How to enable/disable HTTP Proxy in Toolbox
1. docker-machine ssh default 2. sudo vi /var/lib/boot2docker/profile 3. # replace with your offi ...
- SpringBatch简介
spring Batch是一个轻量级的.完善的批处理框架,旨在帮助企业建立健壮.高效的批处理应用.SpringBatch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使 ...
- Linux 性能监测:Memory
这里的讲到的 "内存" 包括物理内存和虚拟内存,虚拟内存(Virtual Memory)把计算机的内存空间扩展到硬盘,物理内存(RAM)和硬盘的一部分空间(SWAP)组合在一起作为 ...
- eclipse安装和中文汉化,以及配置
官网下载 eclipse http://www.eclipse.org/downloads/eclipse-packages/ ----选择 "Eclipse IDE for Java De ...