iOS开发——网络篇&数据解析

数据解析

关于iOS开发的中数据解析的方法有两种JSON和XML,这里只做简单的介绍,会使用就可以了。

JSON——

关于JSON的解析经过很多爱好者的分析使用相同自带的还是最好的,不管是从使用的容易度还是性能方面

NSJSONSerialization

 1 -(void)start
 2 {
 3
 4     NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"];
 5
 6     NSData *jsonData = [[NSData alloc] initWithContentsOfFile:path];
 7
 8     NXJsonParser* jsonParser = [[NXJsonParser alloc] initWithData:jsonData];
 9     id jsonObj = [jsonParser parse:nil ignoreNulls:NO];
10
11     if (!jsonObj) {
12         NSLog(@"JSON数据解析失败。");
13         return;
14     }
15
16     _notes = [jsonObj objectForKey:@"Record"];
17
18     [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadViewNotification" object:self.notes userInfo:nil];
19     self.notes = nil;
20
21 }

XML——

SAX:小数据的XML数据推荐使用NSXMLPaser

DOM(第三方库):大数据的XML数据使用最多的是TBXML和GDataXML,这两种方式使用思路差不多,TBXML更快但是具体使用哪一种看个人爱好和公司的需求

SAX——NSXMLParser

上图是XML的部分数据,就是我需要解析的XML文件对应的数据

NSXMLParser解析源码

 1 -(void)start
 2 {
 3     NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"xml"];
 4
 5     NSURL *url = [NSURL fileURLWithPath:path];
 6     //开始解析XML
 7     NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
 8     parser.delegate = self;
 9     [parser parse];
10     NSLog(@"解析完成...");
11 }
12
13 //文档开始的时候触发
14 - (void)parserDidStartDocument:(NSXMLParser *)parser
15 {
16     _notes = [NSMutableArray new];
17 }
18
19 //文档出错的时候触发
20 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
21 {
22     NSLog(@"%@",parseError);
23 }
24
25 //遇到一个开始标签时候触发
26 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
27   namespaceURI:(NSString *)namespaceURI
28  qualifiedName:(NSString *)qualifiedName
29     attributes:(NSDictionary *)attributeDict
30 {
31     _currentTagName = elementName;
32     if ([_currentTagName isEqualToString:@"Note"]) {
33         NSString *_id = [attributeDict objectForKey:@"id"];
34         NSMutableDictionary *dict = [NSMutableDictionary new];
35         [dict setObject:_id forKey:@"id"];
36         [_notes addObject:dict];
37     }
38
39 }
40
41 //遇到字符串时候触发
42 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
43 {
44     //替换回车符和空格
45     string =[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
46     if ([string isEqualToString:@""]) {
47         return;
48     }
49     NSMutableDictionary *dict = [_notes lastObject];
50
51     if ([_currentTagName isEqualToString:@"CDate"] && dict) {
52         [dict setObject:string forKey:@"CDate"];
53     }
54
55     if ([_currentTagName isEqualToString:@"Content"] && dict) {
56         [dict setObject:string forKey:@"Content"];
57     }
58
59     if ([_currentTagName isEqualToString:@"UserID"] && dict) {
60         [dict setObject:string forKey:@"UserID"];
61     }
62 }
63
64 //遇到结束标签时候出发
65 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
66   namespaceURI:(NSString *)namespaceURI
67  qualifiedName:(NSString *)qName;
68 {
69     self.currentTagName = nil;
70 }
71
72
73 //遇到文档结束时候触发
74 - (void)parserDidEndDocument:(NSXMLParser *)parser
75 {
76     [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadViewNotification" object:self.notes userInfo:nil];
77     self.notes = nil;
78 }

读取数据的方式有:

initWithContentsOfUR:使用url获取文件数据(解析对象)

initWithData:使用NSData创建解析对象

initWithStream:使用IO流创建解析对象

 

DOM——TBXML

 1 //开始解析
 2 -(void)start
 3 {
 4     _notes = [NSMutableArray new];
 5
 6     TBXML* tbxml = [[TBXML alloc] initWithXMLFile:@"Notes.xml" error:nil];
 7
 8     TBXMLElement * root = tbxml.rootXMLElement;
 9
10     // if root element is valid
11     if (root) {
12
13         TBXMLElement * noteElement = [TBXML childElementNamed:@"Note" parentElement:root];
14
15         while ( noteElement != nil) {
16
17             NSMutableDictionary *dict = [NSMutableDictionary new];
18
19             TBXMLElement *CDateElement = [TBXML childElementNamed:@"CDate" parentElement:noteElement];
20             if ( CDateElement != nil) {
21                 NSString *CDate = [TBXML textForElement:CDateElement];
22                 [dict setValue:CDate forKey:@"CDate"];
23             }
24
25             TBXMLElement *ContentElement = [TBXML childElementNamed:@"Content" parentElement:noteElement];
26             if ( ContentElement != nil) {
27                 NSString *Content = [TBXML textForElement:ContentElement];
28                 [dict setValue:Content forKey:@"Content"];
29             }
30
31             TBXMLElement *UserIDElement = [TBXML childElementNamed:@"UserID" parentElement:noteElement];
32             if ( UserIDElement != nil) {
33                 NSString *UserID = [TBXML textForElement:UserIDElement];
34                 [dict setValue:UserID forKey:@"UserID"];
35             }
36
37             //获得ID属性
38             NSString *_id = [TBXML valueOfAttributeNamed:@"id" forElement:noteElement error:nil];
39             [dict setValue:_id forKey:@"id"];
40
41             [_notes addObject:dict];
42
43
44             noteElement = [TBXML nextSiblingNamed:@"Note" searchFromElement:noteElement];
45
46         }
47     }
48
49     NSLog(@"解析完成...");
50
51     [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadViewNotification" object:self.notes userInfo:nil];
52     self.notes = nil;
53
54 }

initWithXMLFile:error:文件中

initWithXMLString:error:返回的字符串中

initWithData:error:NSData中

DOM——GDataXML

 1 /**
 2  * GDataXML解析:DOM----一口气加载所有,适合xml小文件
 3  */
 4 -(void)gDataXML:(NSData *)data
 5 {
 6     // 加载整个XML数据
 7     GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
 8
 9     // 获得文档的根元素 -- videos元素
10     GDataXMLElement *root = doc.rootElement;
11
12     // 获得根元素里面的所有video元素
13     NSArray *elements = [root elementsForName:@"video"];
14
15     // 遍历所有的video元素
16     for (GDataXMLElement *videoElement in elements) {
17         iCocosVideo *video = [[iCocosVideo alloc] init];
18
19         // 取出元素的属性
20         video.id = [videoElement attributeForName:@"id"].stringValue.intValue;
21         video.length = [videoElement attributeForName:@"length"].stringValue.intValue;
22         video.name = [videoElement attributeForName:@"name"].stringValue;
23         video.image = [videoElement attributeForName:@"image"].stringValue;
24         video.url = [videoElement attributeForName:@"url"].stringValue;
25
26         // 添加到数组中
27         [self.videos addObject:video];
28     }
29
30
31 }
时间: 2024-08-03 03:44:15

iOS开发——网络篇&数据解析的相关文章

iOS开发网络篇—数据缓存

iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 (2)程序响应速度不够快 解决上面的问题,一般考虑对数据进行缓存. 二.缓存 为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据. 缓存数据的过程 当服务器返回数据时,需要做以下步骤 (1)使用服务器

iOS开发网络篇—数据的解析

网络上传输数据通用的有XML,JSON等,iOS中也可以用Plist. 要进行数据传输,就要首先进行序列化: 1.序列化. 对象转换成二进制流.(这个一句话就行) 2.反序列化. 二进制流转换为对象等. (关键要弄清楚这个) JSON:(和XML一样都是用来传数据的) 轻量级的数据交换格式,正在逐步取代XML. XML: 结构性的标记语言,易读.但数据量大. Plist偶尔用着玩玩: Mac.iOS中用的多一种格式. 一.应用场景 1.XML的应用场景: XMPP——即时通讯,KissXML R

iOS开发网络篇—数据缓存(使用NSURLCache)

一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 (2)程序响应速度不够快 解决上面的问题,一般考虑对数据进行缓存. 二.缓存 为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据. 缓存数据的过程 当服务器返回数据时,需要做以下步骤 (1)使用服务器的数据(比如解析.显示) (

iOS开发网络篇—JSON数据的解析

iOS开发网络篇—JSON数据的解析 iOS开发网络篇—JSON介绍 一.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组 {"name" : "jack", "age" : 10} {"names" : ["jack", "rose", "jim

iOS开发网络篇—XML数据的解析

iOS开发网络篇—XML数据的解析 iOS开发网络篇—XML介绍 一.XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是常用的一种用于交互的数据格式,一般也叫XML文档(XML Document) XML举例 <videos> <video name="小黄人 第01部" length="30" /> <video name="小黄人 第02部&qu

iOS开发网络篇—发送json数据给服务器以及多值参数

iOS开发网络篇—发送json数据给服务器以及多值参数 一.发送JSON数据给服务器 发送JSON数据给服务器的步骤: (1)一定要使用POST请求 (2)设置请求头 (3)设置JSON数据为请求体 代码示例: 1 #import "YYViewController.h" 2 3 @interface YYViewController () 4 5 @end 6 7 @implementation YYViewController 8 9 - (void)viewDidLoad 10

iOS开发网络篇—发送GET和POST请求(使用NSURLSession)

iOS开发网络篇—发送GET和POST请求(使用NSURLSession) 说明: 1)该文主要介绍如何使用NSURLSession来发送GET请求和POST请求 2)本文将不再讲解NSURLConnection的使用,如有需要了解NSURLConnection如何发送请求. 详细信息,请参考:http://www.cnblogs.com/wendingding/p/3813706.html 3)本文示例代码发送的请求均为http请求,已经对info.plist文件进行配置. 如何配置,请参考:

iOS开发网络篇—NSURLConnection基本使用

iOS开发网络篇—NSURLConnection基本使用 一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法.请求头.请求体.... (3)NSMutableURLRequest:NSURLRequest的子类 (4)NSURLConnection:负责发送请求,建立客户端和服务器的连接.发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据 二.NSUR

iOS开发网络篇—简单介绍ASI框架的使用

iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大. ASI的实现基于底层的CFNetwork框架,因此运行效率很高.可惜作者早已停止更新,有一些潜在的BUG无人去解决 ASI的github地址 https://github.com/pokeb/asi-http-request ASI的使用参考 http://www.cnblogs.com/dot