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 */
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。