解析:按照约定好的格式提取数据的过程叫做解析;

后台开发人员按照约定好的格式存入数据,前端开发人员按照约定的格式读取数据;
主流的格式: XML / JSON 前端和后台都能识别的格式; 

XML解析
XML解析的两种工作原理:
1.SAX解析:基于事件回调的解析机制,逐行进行解析,效率低,适合于大数据解析.  系统提供的NSXMLParser.
.将通过网络请求或者本地路径获取到的数据存储为NSData对象.
.创建解析工具
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];
.设置代理
xmlParser.delegate = self;
.开始解析
[xmlParser parse];
[xmlParser release]; #pragma mark - delegate //当读取到标签后的内容时触发
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
NSLog(@"读取到内容%@", string);
//用属性str存储读取到的标签内容;
_str = string;
}
//当读取到开始标签时触发
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
NSLog(@"开始标签");
if ([elementName isEqualToString:@"Student"]) {
//当读取到开始标签时,创建Student对象.
self.stu = [[[StudentModel alloc] init] autorelease];
//attributeDict 存储节点的属性值
self.stu.position = attributeDict[@"position"];
} }
//当读取到结束标签时触发</Student>
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
NSLog(@"结束标签");
if ([elementName isEqualToString:@"name"]) {
self.stu.name = self.str;
} else if ([elementName isEqualToString:@"gender"]) {
self.stu.gender = self.str;
} else if ([elementName isEqualToString:@"age"]) {
self.stu.age = self.str;
} else if ([elementName isEqualToString:@"motto"]) {
self.stu.motto = self.str;
} else if ([elementName isEqualToString:@"Student"]) {
//读取到Student结束标签时,将Student对象存储到数组中
[self.dataSource addObject:_stu];
}
} //当解析完毕时触发
- (void)parserDidEndDocument:(NSXMLParser *)parser {
NSLog(@"解析完毕");
//当解析完毕时,让tableView重新刷新一下数据
[self.tableView reloadData];
}
2.DOM解析:把解析数据读入内存,初始化生成树形结构,逐层进行解析.效率高,适合于小数据解析. 谷歌提供的GDataXMLNode. 
 
解析工具:

GDataXMLNode  是由Google提供的开源的基于C语言的libxml2.dylib动态链接库而封装的OC的XML解析类,效率比较高. 采用DOM解析的原理.
使用GDataXML Nod步骤:
1.target — Build Phases - Link Binary 添加libxml2.dylib
2.target — Build Setting — 搜索 Header Search path 添加 /usr/include/libxml2
 
libxml2.dylib 与 libxml2.2.dylib的区别:
前者是一个快捷方式,永远指向的是最新的类库,而后者才是真实的类库,使用前者有一个好处,当类库更新时,我们老版本的项目无需再重新导入新的类库. 

 
JSON解析:
JsonKit 是通过给NSString, NSData添加分类的形式,增加解析功能.
 
//系统提供的解析JSON方法
- (void)handleSystemParser:(UIBarButtonItem *)item {
//1.获取文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"];
//2.根据文件路径初始化NSData对象
NSData *data = [NSData dataWithContentsOfFile:filePath];
//解析
NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@", arr); }
//第三方类库解析JSON方法(这里使用JSONKit)
- (void)handleThirdPartParser:(UIBarButtonItem *)item { //将Json格式数据转化为OC对象(NSString对象) //1.获取文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"]; //2.根据文件路径初始化字符串对象
NSString *dataStr = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
//3.解析成OC对象.(可变对象/不可变对象)
NSArray *arr1 = [dataStr objectFromJSONString];
NSArray *arr2 = [dataStr mutableObjectFromJSONString];
NSLog(@"%@",arr1);
NSLog(@"%@", arr2);   }

选择了解---

当然,也可以解析成NSData对象,第一步的方法都一样,获取文件路径

- (void)handleThirdPartParser:(UIBarButtonItem *)item {

    //将Json格式数据转化为OC对象(NSData对象)

    //1.获取文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"]; //根据文件路径初始化成NSData对象
NSData *data = [NSData dataWithContentsOfFile:filePath];
//解析.(可变/不可变)
NSArray *arr1 = [data objectFromJSONData];
NSMutableData *arr2 = [data mutableObjectFromJSONData];

以上是将JSON数据转为OC的对象,下面是讲OC对象转为JSON数据的方法.

    //将OC对象转成JSON格式数据.

    //1.将OC的数组对象转成JSON格式数据.
NSArray *arr1 = @[@"aa",@"bb",@"cc",@"dd"];
NSData *jsonData1 = [arr1 JSONData];//转成JSON格式Data
NSString *jsonStr1 = [arr1 JSONString]; //转成JSON格式String //2.将OC的字典对象转成JSON格式数据.
NSDictionary *dic2 = @{@"name":@"Frank",
@"age":@""
};
NSData *jsonData2 = [dic2 JSONData];//转成JSON格式Data
NSString *jsonStr2 = [dic2 JSONString];//转成JSON格式String

iOS学习之数据解析的更多相关文章

  1. iOS学习——JSON数据解析(十一)

    在之前的<iOS学习——xml数据解析(九)>介绍了xml数据解析,这一篇简单介绍一下Json数据解析.JSON 即 JavaScript Object Natation,它是一种轻量级的 ...

  2. iOS学习—JSON数据解析

      关于在iOS平台上进行JSON解析,已经有很多第三方的开源项目,比如TouchJson,JSONKit,SBJon等,自从iOS5.0以后,苹果SDK推出了自带的JSON解决方案NSJSONSer ...

  3. iOS学习之数据请求

    GET请求----同步连接 //GET请求 同步连接 - (void)handleSynchronize:(UIBarButtonItem *)item { //GET请求 //1.创建网址字符串; ...

  4. 【iOS】Plist-XML-JSON数据解析

    网络上数据传输通用的有XML.JSON等,iOS中也能够用Plist. 要进行传输数据.就要首先进行序列化: 1.序列化.  对象转换成二进制流.(这个一句话即可) .反序列化. 二进制流转换为对象等 ...

  5. iOS学习笔记--数据存储

    iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data 1. XM ...

  6. iOS 学习 - 22 异步解析 JSON,使用 FMDB 存储,TableView 显示

    前提是已经知道了有哪些 key 值 Model 类: .h @interface ListModel : NSObject @property (nonatomic, copy)NSString *t ...

  7. ios网络_json数据解析

    网络上数据传输以json或者xml格式. json是字典 或者 数组 或者字典跟数组嵌套的形式.解析json就是把json反序列化(解析)---把json转换为oc对象.json序列化就是把oc对象转 ...

  8. iOS学习之数据持久化详解

    前言 持久存储是一种非易失性存储,在重启设备时也不会丢失数据.Cocoa框架提供了几种数据持久化机制: 1)属性列表: 2)对象归档: 3)iOS的嵌入式关系数据库SQLite3: 4)Core Da ...

  9. 【原】iOS学习之UIStoryboardSegue解析

    在 Storyboard 的可视化编程中,跳转界面就是按住 Ctrl 使用鼠标头一条连线就可以解决,相当的简单!本篇博客主要就是介绍这条连线,在iOS中,这条连线也是一个对象,也有其自己的初始化方法和 ...

随机推荐

  1. 分布式文件系统 FastDFS Ceph

    分布式文件系统 FastDFS Cephhttp://www.oschina.net/p/fastdfshttp://www.oschina.net/p/ceph FastDFS 的 Go 客户端 f ...

  2. java调优随记-堆和栈

    基础知识: 关于堆和栈,堆和栈是程序运行的关键,关于堆和栈的定义和解释可自行搜索,我比较认可以程序运行过程中他们扮演的角色作为对比的点:堆是存储的单位,而栈是程序运行时的单位.栈解决的是程序的运行问题 ...

  3. cf435A Queue on Bus Stop

      A. Queue on Bus Stop time limit per test 1 second memory limit per test 256 megabytes input standa ...

  4. codeforces 277.5 div2 F:组合计数类dp

    题目大意: 求一个 n*n的 (0,1)矩阵,每行每列都只有两个1 的方案数 且该矩阵的前m行已知 分析: 这个题跟牡丹江区域赛的D题有些类似,都是有关矩阵的行列的覆盖问题 牡丹江D是求概率,这个题是 ...

  5. 远程连接mysql

    win系统下,连接别人的mysql或者让别人链接自己的mysql: 打开命令行cmd 进入mysql: mysql -u root -p mysql>use mysql;  mysql>s ...

  6. Beanstalkd介绍

    特征 优先级:任务 (job) 可以有 0~2^32 个优先级, 0 代表最高优先级,beanstalkd 采用最大最小堆 (Min-max heap) 处理任务优先级排序, 任何时刻调用 reser ...

  7. shell中的替换

    shell中如果存在一些特殊的字符,就需要进行替换,可进行命令替换.变量替换.转义替换 1.转义字符的替换 shell中包含以下的转移字符 \a   响铃警报\\   反斜杠 \b  退格(删除键) ...

  8. JS~模拟表单在新窗口打开,避免广告拦截

    说起广告拦截,这应该是浏览器的一个特性,它会将window.open产生的窗口默认为一个广告,将它进行拦截,但有时,这不是我们所希望的,有时,我们就是需要它在客户端的浏览器上弹出一个新窗口,以展示数据 ...

  9. Ubuntu16.04下安装数据库oracle客户端

    在Ubuntu16.04下安装oracle数据库客户端,使Django项目连接到远程Oracle数据库. 1.下载oracle客户端安装包: 进入官网http://www.oracle.com/tec ...

  10. C++ 推断进程是否存在

    [cpp] view plaincopyprint? #include <windows.h> #include "psapi.h" #include"std ...