iOS开发——网络编程OC篇&数据解析总结

数据解析总结

  1 //***************************************************XML
  2
  3 /**
  4 NSXML
  5 */
  6 /**
  7 // 1. 开始解析XML文档
  8 - (void)parserDidStartDocument:
  9
 10 // 2. 开始解析某个元素,会遍历整个XML,识别元素节点名称
 11 - (void)parser:didStartElement:namespaceURI:qualifiedName:attributes:
 12 // 3. 文本节点,得到文本节点里存储的信息数据,对于大数据可能会接收多次!为了节约内存开销
 13 - (void)parser:foundCharacters:
 14 // 4. 结束某个节点,存储从parser:foundCharacters:方法中获取到的信息
 15 - (void)parser:didEndElement:namespaceURI:qualifiedName:
 16 注意:在解析过程中,2、3、4三个方法会不停的重复执行,直到遍历完成为止
 17
 18 // 5. 解析XML文档结束
 19 - (void)parserDidEndDocument:
 20 // 6. 解析出错
 21 - (void)parser:parseErrorOccurred:
 22
 23
 24
 25 @interface ALViewController ()
 26
 27 @property (nonatomic, strong) NSMutableArray *dataList;
 28 // 来回拼接
 29 @property (nonatomic, strong) NSMutableString *elementString;
 30 // 当前视频信息的对象
 31 @property (nonatomic, strong) Video *v;
 32
 33 @end
 34
 35 @implementation MJViewController
 36
 37 - (void)viewDidLoad
 38 {
 39 [super viewDidLoad];
 40
 41 // 加载数据方法
 42 [self loadData];
 43 }
 44
 45 #pragma mark - 表格的数据源方法
 46 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 47 {
 48 return self.dataList.count;
 49 }
 50
 51 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 52 {
 53 // 1.创建cell
 54 static NSString *ID = @"CELL";
 55 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
 56
 57 // 2.设置cell的数据
 58 Video *v = self.dataList[indexPath.row];
 59
 60 cell.textLabel.text = v.name;
 61
 62 return cell;
 63 }
 64
 65 #pragma mark - 加载数据
 66 - (IBAction)loadData
 67 {
 68 // 1. URL
 69 NSURL *url = [NSURL URLWithString:@"http://localhost/videos.php"];
 70 // 2. Request
 71 NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:10.0f];
 72
 73 // 开始显示刷新控件
 74 [self.refreshControl beginRefreshing];
 75
 76 // 3. 发送请求
 77 [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init]completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
 78
 79 // 1>
 80 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
 81
 82 // 2> 设置代理
 83 parser.delegate = self;
 84
 85 // 3> 开始解析
 86 [parser parse];
 87 }];
 88 }
 89
 90 #pragma mark - XML解析代理方法
 91 #pragma mark 1. 开始
 92 - (void)parserDidStartDocument:(NSXMLParser *)parser
 93 {
 94 NSLog(@"开始解析文档");
 95 // 准备工作
 96 // 1> dataList
 97 if (!self.dataList) {
 98 self.dataList = [NSMutableArray array];
 99 } else {
100 [self.dataList removeAllObjects];
101 }
102
103 // 2> elementString
104 if (!self.elementString) {
105 self.elementString = [NSMutableString string];
106 } else {
107 // 清空可变字符串不要设置成nil,使用setString只是清空内容,下次不会再次实例化
108 [self.elementString setString:@""];
109 }
110 }
111
112 #pragma mark 2. 所有开始一个节点:
113 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
114 {
115 NSLog(@"开始节点:%@ %@", elementName, attributeDict);
116 // 如果是新建对象
117 if ([elementName isEqualToString:@"video"]) {
118 self.v = [[Video alloc] init];
119 self.v.videoId = attributeDict[@"videoId"];
120 }
121
122 // 每开始一个新节点之前都清空elementString
123 // 避免上一次的结果被重复拼接,例如拼完名字是"abc",再拼长度就会变成"vda1234"
124 [self.elementString setString:@""];
125 }
126
127 #pragma mark 3. 查找内容,可能会重复多次
128 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
129 {
130 // 拼接字符串
131 [self.elementString appendString:string];
132 }
133
134 #pragma mark 4. 节点结束
135 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
136 {
137 NSLog(@"结束节点 %@", elementName);
138 // 判断如果是要复制
139 if ([elementName isEqualToString:@"video"]) {
140 [self.dataList addObject:self.v];
141 } else if (![elementName isEqualToString:@"videos"]) {
142 [self.v setValue:self.elementString forKey:elementName];
143 }
144 // 提示:使用KVC只要是数值型的属性,kvc会自动设置成对应的属性,而无需程序员参与
145 //    if ([elementName isEqualToString:@"name"]) {
146 //        self.v.name = self.elementString;
147 //    } else if ([elementName isEqualToString:@"length"]) {
148 //        self.v.length = [NSNumber numberWithInt:[self.elementString intValue]];
149 //    }
150 }
151
152 #pragma mark 5. 文档结束
153 - (void)parserDidEndDocument:(NSXMLParser *)parser
154 {
155 NSLog(@"解析结束 %@ %@", self.dataList, [NSThread currentThread]);
156
157 dispatch_async(dispatch_get_main_queue(), ^{
158 [self.tableView reloadData];
159
160 // 关闭刷新控件的刷新
161 [self.refreshControl endRefreshing];
162 });
163 //    [self.dataList enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
164 //        NSLog(@"%@", obj);
165 //    }];
166 }
167
168 #pragma mark 6. 出错处理
169 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
170 {
171 NSLog(@"%@", parseError.localizedDescription);
172 }
173
174
175 @end
176 */
177
178
179
180 /**
181 TBXML
182 */
183 /**
184 //解析代码
185 - (void)testTBXM:(TBXML *)tbx {
186 TBXMLElement *root = tbx.rootXMLElement;
187 TBXMLElement *author = [TBXML childElementNamed:@"author" parentElement:root];
188 NSString *name = [TBXML valueOfAttributeNamed:@"name" forElement:author];
189 NSLog(@"author:%@", name);
190 TBXMLElement *book = [TBXML childElementNamed:@"book" parentElement:author];
191 TBXMLElement *descriptionElem = [TBXML childElementNamed:@"description" parentElement:book];
192 NSString * description = [TBXML textForElement:descriptionElem];
193 NSLog(@"author:%@", description);
194 }
195
196 2.递归解析未知结构的xml。
197
198 //主调用方法
199
200 - (void)dealUnknow:(TBXML *)tbx {
201 if (tbx.rootXMLElement) {
202 TBXMLElement *element = tbx.rootXMLElement;
203 [self recurrence:element];
204 }
205 else {
206 NSLog(@"Format Error!");
207 }
208 }
209
210 //递归子方法
211
212 - (void)recurrence:(TBXMLElement *)element {
213 do {
214
215 NSLog(@"<%@>:{%@}",[TBXML elementName:element], [TBXML textForElement:element]);// Display the name of the element
216
217 //迭代处理所有属性
218 TBXMLAttribute * attribute = element->firstAttribute;
219 while (attribute) {
220 //显示
221 NSLog(@"<%@>->[%@ = %@]", [TBXML elementName:element], [TBXML attributeName:attribute], [TBXML attributeValue:attribute]);
222 //迭代
223 attribute = attribute->next;
224 }
225
226 //递归处理子树
227 if (element->firstChild) {
228 [self recurrence:element->firstChild];
229 }
230
231 //迭代处理兄弟树
232 } while ((element = element->nextSibling));
233 }
234
235 总之,tbxml解析xml飞速、简洁,可惜不能操作回写,仅陷于解析,做rss巨合适不过了!
236
237 如想进步了解,请参加下篇,tbxml常用api:
238 */
239
240
241
242
243 //****************************************************JSON
244 /**
245  系统自带的
246 */
247 /**
248  - (IBAction)btnPressIOS5Json:(id)sender {
249
250  NSError *error;
251  //加载一个NSURL对象
252  NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://m.weather.com.cn/data/101180601.html"]];
253  //将请求的url数据放到NSData对象中
254  NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
255  //IOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中
256  NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
257  NSDictionary *weatherInfo = [weatherDic objectForKey:@"weatherinfo"];
258  txtView.text = [NSString stringWithFormat:@"今天是 %@  %@  %@  的天气状况是:%@  %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]];
259  NSLog(@"weatherInfo字典里面的内容为--》%@", weatherDic );
260  }
261  */
262
263 /**
264  TouchJson
265  */
266 /**
267  //使用TouchJson来解析北京的天气
268  - (IBAction)btnPressTouchJson:(id)sender {
269  //获取API接口
270  NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101010100.html"];
271  //定义一个NSError对象,用于捕获错误信息
272  NSError *error;
273  NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
274  NSLog(@"jsonString--->%@",jsonString);
275  //将解析得到的内容存放字典中,编码格式为UTF8,防止取值的时候发生乱码
276  NSDictionary *rootDic = [[CJSONDeserializer deserializer] deserialize:[jsonString dataUsingEncoding:NSUTF8StringEncoding] error:&error];
277  //因为返回的Json文件有两层,去第二层内容放到字典中去
278  NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];
279  NSLog(@"weatherInfo--->%@",weatherInfo);
280  //取值打印
281  txtView.text = [NSString stringWithFormat:@"今天是 %@  %@  %@  的天气状况是:%@  %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]];
282
283  }
284  */
285
286 /**
287   SBJson
288  */
289 /**
290  //使用SBJson解析南阳的天气
291  - (IBAction)btnPressSBJson:(id)sender {
292  NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101180701.html"];
293  NSError *error = nil;
294  NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
295  SBJsonParser *parser = [[SBJsonParser alloc] init];
296
297  NSDictionary *rootDic = [parser objectWithString:jsonString error:&error];
298  NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];
299  txtView.text = [NSString stringWithFormat:@"今天是 %@  %@  %@  的天气状况是:%@  %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]];
300  }
301  */
302
303 /**
304   JSONKit
305  */
306 /**
307  - (IBAction)btnPressJsonKit:(id)sender {
308
309  //如果json是“单层”的,即value都是字符串、数字,可以使用objectFromJSONString
310  NSString *json1 = @"{\"a\":123, \"b\":\"abc\"}";
311  NSLog(@"json1:%@",json1);
312  NSDictionary *data1 = [json1 objectFromJSONString];
313  NSLog(@"json1.a:%@",[data1 objectForKey:@"a"]);
314  NSLog(@"json1.b:%@",[data1 objectForKey:@"b"]);
315  [json1 release];
316
317  //如果json有嵌套,即value里有array、object,如果再使用objectFromJSONString,程序可能会报错(测试结果表明:使用由网络或得到的php/json_encode生成的json时会报错,但使用NSString定义的json字符串时,解析成功),最好使用objectFromJSONStringWithParseOptions:
318  NSString *json2 = @"{\"a\":123, \"b\":\"abc\", \"c\":[456, \"hello\"], \"d\":{\"name\":\"张三\", \"age\":\"32\"}}";
319  NSLog(@"json2:%@", json2);
320  NSDictionary *data2 = [json2 objectFromJSONStringWithParseOptions:JKParseOptionLooseUnicode];
321  NSLog(@"json2.c:%@", [data2 objectForKey:@"c"]);
322  NSLog(@"json2.d:%@", [data2 objectForKey:@"d"]);
323  [json2 release];
324  }
325  */
时间: 2024-08-07 00:12:49

iOS开发——网络编程OC篇&数据解析总结的相关文章

iOS开发——网络编程OC篇&amp;数据请求总结

数据请求总结 1 //**************************************GET 2 //同步 3 /* 4 //第一步,创建URL 5 NSURL * url = [[NSURL alloc]initWithString:@"http://e.hiphotos.baidu.com/image/w%3D1366%3Bcrop%3D0%2C0%2C1366%2C768/sign=66f9b9980ef431adbcd2473a7d0097cc/08f790529822720

iOS开发——网络编程OC篇&amp;(九)数据解析

数据解析 关于iOS开发的中数据解析的方法有两种JSON和XML,这里只做简单的介绍,会使用就可以了. JSON—— 关于JSON的解析经过很多爱好者的分析使用相同自带的还是最好的,不管是从使用的容易度还是性能方面 NSJSONSerialization 1 -(void)start 2 { 3 4 NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"]; 5

iOS开发——网络编程OC篇&amp;(三)数据请求

一.GET请求和POST请求简单说明 创建GET请求 1 // 1.设置请求路径 2 NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text]; 3 NSURL *url=[NSURL URLWithString:urlStr]; 4 5 // 2.创建请求对

iOS开发——网络编程OC篇&amp;(十二)AFN详解

AFN详解 众所周知,苹果搞的一套框架NSContention发送请求与接收请求的方式十分繁琐.操作起来很不方便.不仅要做区分各种请求设置各种不同的参数,而且还要经常在多线程里操作,同时还要对请求与返回的数据做各种序列化的操作,同时还要考虑请求数据的安全等一堆问题. 一.早前的几个网络框架 1.ASI框架: HTTP终结者.很牛, 但是有BUG, 已经停止更新. 2.MKNetworkKit (印度人写的). 3.AFN一直还在更新. AFNetworking的出现:MAC/iOS设计的一套网络

iOS开发——网络编程OC篇&amp;总结

网络开发总结 一.一个HTTP请求的基本要素 1.请求URL:客户端通过哪个路径找到服务器 2.请求参数:客户端发送给服务器的数据 * 比如登录时需要发送的用户名和密码 3.返回结果:服务器返回给客户端的数据 * 一般是JSON数据或者XML数据 二.基本的HTTP请求的步骤(移动客户端)1.拼接"请求URL" + "?" + "请求参数" * 请求参数的格式:参数名=参数值 * 多个请求参数之间用&隔开:参数名1=参数值1&参数

iOS开发——网络编程OC篇&amp;Socket编程

Socket编程 一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要

iOS开发——网络编程OC篇&amp;(十)NSURLConnection/NSSeccession

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

iOS开发——网络编程OC篇&amp;(一)XMPP简单介绍与准备

XMPP简单介绍与准备 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容. 有许多的IM系统,如AOL IM.Yahoo IM. MSN以及QQ,它们最大的区别在于各自通讯协议的实现,所以即时通讯技术的核心在于它的传输协议. 协议用来说明信息在网络上如何传输,如果有了统一的传输协议,那么应当可以实现各个IM之间的直接通讯,为了创建即时通讯的统一标准,目前已经出现过

iOS开发——网络编程OC篇&amp;使用WebView构建HyBird应用

使用WebView构建HyBird应用 HyBird是一种本地技术与Web相结合,能过实现跨平台的移动应用开发,最常用的一个框架:PhoneGap 一:首先,写好html代码 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, m