网络上传输数据通用的有XML,JSON等,iOS中也可以用Plist。

要进行数据传输,就要首先进行序列化:

1.序列化.
 对象转换成二进制流.(这个一句话就行)
2.反序列化.
二进制流转换为对象等. (关键要弄清楚这个)
JSON:(和XML一样都是用来传数据的)
轻量级的数据交换格式,正在逐步取代XML.
XML:
结构性的标记语言,易读.但数据量大.
Plist偶尔用着玩玩:
Mac、iOS中用的多一种格式。
一、应用场景
1、XML的应用场景:
XMPP——即时通讯,KissXML
RSS目前还有少量的企业在使用
开源的WebServices,例如天气预报等
如果设计好XML的接口,XML的解析并不会太复杂
2、JSON的应用场景:(数据量小,轻量级)
移动开发中绝大多数还是使用JSON
如果自己开发,或者公司后台接口,最好使用JSON.
二、Plist解析数据
定义一个Plist的格式如下:
解析代码如下:(在异步线程中进行, 最后得到array)
[objc] view plaincopy
  1. - (void)loadData
  2. {
  3. // 1. url
  4. NSURL *url = [NSURL URLWithString:@"http://localhost/videos.plist"];
  5. // 2. request
  6. // timeoutInterval 如果5.0之内没有从服务器返回结果,就认为超时了
  7. /**
  8. NSURLRequestUseProtocolCachePolicy = 0,            // 使用协议缓存策略(默认)
  9. NSURLRequestReloadIgnoringLocalCacheData = 1,      // 忽略本地缓存数据(断点续传时使用)
  10. NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, == 1
  11. // 以下少用
  12. NSURLRequestReturnCacheDataElseLoad = 2,           // 如果有缓存,就返回缓存数据,否则加载
  13. NSURLRequestReturnCacheDataDontLoad = 3,           // 死活不加载远程服务器数据,如果用户没有网络连接时可以使用
  14. // 以下没有实现
  15. NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // 没有实现
  16. NSURLRequestReloadRevalidatingCacheData = 5, // 没有实现
  17. */
  18. NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:5.0];
  19. // 3. 网络异步请求
  20. [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
  21. if (connectionError) {
  22. NSLog(@"错误 %@", connectionError);
  23. return;
  24. }
  25. // data是一个plist数据, 对data进行反序列化,解析
  26. NSArray *array = [NSPropertyListSerialization propertyListWithData:data options:0 format:NULL error:NULL];
  27. // 刷新数据,在UI线程中更新UI
  28. dispatch_async(dispatch_get_main_queue(), ^{
  29. //.....
  30. });
  31. }];
  32. }

三、XML解析

iOS中XML解析方式的两种方式(Android中好友pull等) :
1、SAX(SimpleAPI for XML)
只能读,不能修改,只能顺序访问,适合解析大型XML,解析速度快
常应用于处理大量数据的XML,实现异构系统的数据访问,实现跨平台
从文档的开始通过每一节点移动,定位一个特定的节点
2、DOM(DocumentObject Model)
不仅能读,还能修改,而且能够实现随机访问,缺点是解析速度慢,适合解析小型文档.方便操作.
在内存中生成节点树操作代价昂贵
XML解析步骤:
1、实例化NSXMLParser,传入从服务器接收的XML数据
2、定义解析器代理
3、解析器解析,通过解析代理方法完成XML数据的解析。
解析XML用到的的代理方法:

1. 开始解析XML文档

- (void)parserDidStartDocument:

2. 开始解析某个元素,会遍历整个XML,识别元素节点名称,如<video>开头

-(void)parser:didStartElement:namespaceURI:qualifiedName:attributes:

3. 文本节点,得到文本节点里存储的信息数据。 节点中的数据<video>XXXX</video>

- (void)parser:foundCharacters:

4. 结束某个节点  如</video>开头

- (void)parser:didEndElement:namespaceURI:qualifiedName:

注意:在解析过程中,2、3、4三个方法会不停的重复执行,直到遍历完成为止

5.解析XML文档结束

- (void)parserDidEndDocument:

6.解析出错

-(void)parser:parseErrorOccurred:
注意: 从网络上加装数据是不能用懒加载的.

XML文件格式如下
[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <videos>
  3. <video videoId="1">
  4. <name>苍老师1</name>
  5. <length>320</length>
  6. <videoURL>/苍老师1.mp4</videoURL>
  7. <imageURL>/苍老师1.png</imageURL>
  8. <desc>学iOS找苍老师1</desc>
  9. <teacher>苍老师111</teacher>
  10. </video>
  11. <video videoId="2">
  12. <name>苍老师2</name>
  13. <length>2708</length>
  14. <videoURL>/苍老师2.mp4</videoURL>
  15. <imageURL>/苍老师2.png</imageURL>
  16. <desc>学iOS找苍老师2</desc>
  17. <teacher>苍老师222</teacher>
  18. </video>
  19. </videos>

解析代码如下

[objc] view plaincopy
  1. /** 加载数据 */
  2. - (void)loadData
  3. {
  4. // 1. url确定资源
  5. NSURL *url = [NSURL URLWithString:@"http://localhost/videos.xml"];
  6. // 2. request建立请求
  7. NSURLRequest *request = [NSURLRequest requestWithURL:url];
  8. // 3. 发送异步请求,新建数据处理队列,待数据处理完成后,再更新UI
  9. [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
  10. // 1> 实例化XML解析器
  11. NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
  12. // 2> 设置解析器的代理
  13. parser.delegate = self;
  14. // 3> 开始解析
  15. [parser parse];
  16. }];
  17. }
  18. #pragma mark - XML解析代理方法
  19. // 1. 开始解析文档
  20. - (void)parserDidStartDocument:(NSXMLParser *)parser
  21. {
  22. // 为了避免重复刷新数据,可以清空数组
  23. [self.videoList removeAllObjects];
  24. }
  25. // 2,3,4三个方法会循环被调用
  26. // 2. 开始一个元素(节点)<xxx>
  27. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
  28. {
  29. if ([elementName isEqualToString:@"video"]) {
  30. // 创建新的video对象
  31. self.currentVideo = [[Video alloc] init];
  32. // 使用KVC赋值
  33. [self.currentVideo setValue:attributeDict[@"videoId"] forKeyPath:@"videoId"];
  34. }
  35. // 在开始第3个方法前,清空字符串内容
  36. [self.elementM setString:@""];
  37. }
  38. // 3. 发现字符(节点中间内容)
  39. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
  40. {
  41. [self.elementM appendString:string];
  42. }
  43. // 4. 结束节点</xxx>
  44. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
  45. {
  46. if ([elementName isEqualToString:@"video"]) {
  47. // 将当前正在解析的节点添加到数组
  48. [self.videoList addObject:self.currentVideo];
  49. } else if (![elementName isEqualToString:@"videos"]) {
  50. [self.currentVideo setValue:self.elementM forKeyPath:elementName];
  51. }
  52. }
  53. // 5. 结束文档解析
  54. - (void)parserDidEndDocument:(NSXMLParser *)parser
  55. {
  56. NSLog(@"结束文档解析 %@", self.videoList);
  57. NSLog(@"%@", [NSThread currentThread]);
  58. dispatch_async(dispatch_get_main_queue(), ^{
  59. //UI线程中刷新UI......
  60. });
  61. }
  62. // 6. 在处理网络数据时,千万不要忘记出错处理
  63. - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
  64. {
  65. NSLog(@"错误 %@", parseError);
  66. }

四、JSON解析

解析出来的数据需要进行反序列化,方法如下:
[NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
JSON解析方便、且轻量级,特别对于手机端,节省流量,快。
JSON格式数据如下:
[javascript] view plaincopy
  1. [
  2. {"videoId":"1",
  3. "name":"苍老师1",
  4. "length":"320",
  5. "videoURL":"\/苍老师1.mp4",
  6. "imageURL":"\/苍老师1.png",
  7. "desc":"学iOS找苍老师1",
  8. "teacher":"苍老师111"},
  9. {"videoId":"2",
  10. "name":"苍老师2",
  11. "length":"2708",
  12. "videoURL":"\/苍老师2.mp4",
  13. "imageURL":"\/苍老师2.png",
  14. "desc":"学iOS找苍老师2",
  15. "teacher":"苍老师222"
  16. }
  17. ]

解析代码如下:

[objc] view plaincopy
  1. - (void)loadData
  2. {
  3. // 1. url
  4. NSURL *url = [NSURL URLWithString:@"http://localhost/videos.json"];
  5. // 2. request
  6. NSURLRequest *request = [NSURLRequest requestWithURL:url];
  7. // 3. 发送异步请求
  8. [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
  9. // data是一个json数据
  10. // 对data进行反序列化,解析
  11. NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
  12. // 刷新数据,更新UI
  13. dispatch_async(dispatch_get_main_queue(), ^{
  14. //在主线程中更新UI......
  15. });
  16. }];
  17. }

转载请注明出处:http://blog.csdn.net/xn4545945  

【iOS】Plist-XML-JSON数据解析相关推荐

  1. iOS开发——XML/JSON数据解析

    NSJSONSerialization 接下来就正式开始.苹果官方给出的解析方式是性能最优越的,虽然用起来稍显复杂. 首先我们在上面已经有了我希望得到的信息的网站的API给我们的URL,在OC中,我要 ...

  2. java数组里套数组_用JAVA进行Json数据解析(对象数组的相互嵌套)

    这段时间我们在做一个英语翻译软件的小小小APP,涉及到了对Json数据的解析,所以特地来总结一下! 假设我们要对如下数据进行解析,其实在平时,返回的Json数据是很乱的,很难分清数据的关系,这是经过相 ...

  3. spark中读取json_【spark】文件读写和JSON数据解析

    1.读文件 通过 sc.textFile("file://")方法来读取文件到rdd中. val lines = sc.textFile("file://")/ ...

  4. iOS进阶(XML、JSON数据解析)

    1.XML解析之DOM解析 需要用到libxml2.dylib框架 和GDataXMLNode工具 DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中.从而消耗很大的内存空间.DOM ...

  5. linux下json数据解析,JSON数据解析 - iOS学习笔记_Linux编程_Linux公社-Linux系统门户网站...

    在之前的<iOS学习--xml数据解析(九)>http://www.linuxidc.com/Linux/2014-02/97020p9.htm 介绍了xml数据解析,这一篇简单介绍一下J ...

  6. 在线解析xml,json数据的网址

    在线解析xml,json数据的网址 https://www.sojson.com/yasuoyihang.html

  7. Android学习笔记44:JSON数据解析

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 本文将主要介绍在Android ...

  8. Android json数据解析及简单例子

    JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...

  9. Linux7081端口,bash,linux_利用shell将json数据解析后排序问题,bash,linux,ubuntu,json - phpStudy...

    利用shell将json数据解析后排序问题 最近在写一个模仿dropbox_uploader的百度网盘的shell脚本.通过调用pcs的api返回一个目录下的所有文件.返回的json数据如下: {&q ...

  10. 基于QT的【第一个项目】设计+所有组件配合使用+网络编程局域网通信+文件IO操作+登录界面和头像+多界面跳转+JSON数据解析+表情包制作

    基于QT的第一个项目+所有组件配合使用+网络编程局域网通信+文件IO操作+登录界面和头像+多界面跳转+JSON数据解析+表情包制作 第一阶段 网络编程局域网TCP/IP聊天QT实现 main.c ma ...

最新文章

  1. W3C 战败:无权再制定 HTML 和 DOM 标准!
  2. 如何在CSMAR中找到不同公司,不同时间的数据呢?
  3. 老李分享:https协议
  4. 初识Python-1
  5. UVa 12206 (字符串哈希) Stammering Aliens
  6. Linux下搭建BT服务器
  7. zabbix安装配置
  8. Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案 [转]
  9. 火狐浏览器国内版和国际版区别
  10. 五笔:25 个一级简码(口诀)
  11. imageJ打不开mp4怎么办?
  12. IPTV和宽带网络融合
  13. Swagger界面丑、功能弱怎么破?用Postman增强下就给力了!
  14. 第22章 迈向Spring MVC的旅程
  15. 自学Java!三面蚂蚁核心金融部,Java岗
  16. 人物介绍的排版【小白进】
  17. 注册表中修改桌面背景
  18. topcoder srm 390 div1
  19. 中值滤波与均值滤波对椒盐噪声处理的比较
  20. 储能辅助电力系统调峰的容量需求优化配置matlab/cplex

热门文章

  1. 【无标题】A <Route> is only ever to be used as the child of <Routes> element, never rendered directly. Pl
  2. 朗道-西格尔零点猜想(the Landau-Siegel Zeros Conjecture)
  3. JenKins添加Git报错Error performing git command: git ls-remote -h
  4. 八年级作文-断了的弦
  5. python基础篇11-文件操作
  6. Vue 拦截器 多接口调用 实现唯一loding效果 解决同步接口调用loding闪动
  7. 微商个人相册多端小程序源码
  8. 天津大学计算机学院考研复试名单,天津大学各学院2019考研复试办法及复试名单...
  9. MPEG-TS 格式解析
  10. a1a2b1b2c1c2语言级别区分,西班牙语 | 西班牙语的等级是怎么划分的?(A1/A2、B1/B2、C1/C2)...