有了网络请求,那就能够拿到服务器上的资源数据了,我们拿到的数据一般有两种格式 xml 和 json ,下面看一下怎么解析这些数据
xml格式
先看一下xml的格式,其实就是标签对
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?xml version="1.0" encoding="UTF-8"?> <users> <user> <name>1eer1eer1eer1eer1eer1eer</name> <tname>qtrrrrrrr</tname> <email>qd</email> </user> <user> <name>to</name> <tname>to</tname> <email>to</email> </user> <user> <name>1176910151</name> <tname>ke</tname> <email>1176910151</email> </user> <user> <name>6</name> <tname>6</tname> <email>6</email> </user> </users> |
而我们的解析也是根据标签对来的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
- (void)xmlParserTest{ // 正常情况下数据 是由服务器返回的 // 我们这里从文件中读出来 NSString *path = [[NSBundle mainBundle] pathForResource:@"user" ofType:@"xml"]; NSData *data = [[NSData alloc] initWithContentsOfFile:path]; // 解析的代码 // 创建一个解析器 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; parser.delegate = self; // 开始解析 解析是一个同步的过程 [parser parse]; } // 开始解析 - (void)parserDidStartDocument:(NSXMLParser *)parser{ NSLog(@"开始解析"); // 开始解析的时候 初始化缓冲区 _buffer = [[NSMutableString alloc] init]; // 用来保存 封装好的user对象 _array = [[NSMutableArray alloc] init]; } // 找到开始标签 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ NSLog(@"找到开始标签"); // 每次遇到开始标签 都把可变字符串清空 [_buffer setString:@""]; // 读到user的开始标签 说明马上要读user的内容,所以创建一个对象 准备保存user的数据 if ([elementName isEqualToString:@"user"]){ _user = [[DCUser alloc] init]; } } // 找到内容 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ NSLog(@"找到内容"); [_buffer appendString:string]; } // 找到结束标签 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ NSLog(@"找到结束标签"); if ([elementName isEqualToString:@"name"]){ // 说明此时已经把name的内容读完了 _user.name = _buffer; } if ([elementName isEqualToString:@"tname"]){ _user.tName = _buffer; } if ([elementName isEqualToString:@"email"]){ _user.email = _buffer; } if ([elementName isEqualToString:@"user"]){ // 说明已经把一个user读完了 [_array addObject:_user]; } } // 结束解析 - (void)parserDidEndDocument:(NSXMLParser *)parser{ NSLog(@"结束解析"); for (DCUser *user in _array) { NSLog(@"name %@",user.name); } } |
json格式
由于xml格式解析起来比较繁琐,而且携带数据量有限,所以出现了json格式,现在大部分的数据传输都采用了json格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
{ "id": 1, "type": 1, "channel": "互联网", "news_title": "冰桶挑战赛:被玩坏了的公益营销", "intro": "从企业公关营销角度上,对于大佬们如此齐心的联手炒作“冰桶挑战赛”也很好理解。因为无论从哪方面来看,参与这次活动都是回报率极大的。", "source_url": "/st/news/news1.json", "time": "08月19日 10:45", "source": "百度", "readtimes": 3903, "auther": "李东楼", "images": [ { "url": "/st/news/news1-1.jpg", "width": 300, "height": 300 }, { "url": "/st/news/news1-1.jpg", "width": 300, "height": 300 }, { "url": "/st/news/news1-1.jpg", "width": 300, "height": 300 } ] } |
而json的数据我们拿到之后只需要使用 NSJSONSerialization 这个类序列化成字典就可以取出数据了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// 我们这里从文件中读出来 NSString *path = [[NSBundle mainBundle] pathForResource:@"news_list" ofType:@"json"]; NSData *data = [[NSData alloc] initWithContentsOfFile:path]; // 重点是 服务器返回给你一个段data之后,怎么解析 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; NSArray *newsArray = [dict objectForKey:@"news_list"]; NSMutableArray *array = [[NSMutableArray alloc] init]; for (NSDictionary *smallDict in newsArray){ // 每一个smallDict 对应的是一个新闻信息 // smallDict -->> news DCNews *news = [DCNews parseNewsWithDictionary:smallDict]; [array addObject:news]; NSLog(@".... %@",news.newsTitle); } //在model中取出数据 news.newsId = [[dict objectForKey:@"id"] intValue]; news.newsType = [[dict objectForKey:@"type"] intValue]; news.newsChannel = [dict objectForKey:@"channel"]; news.newsTitle = [dict objectForKey:@"news_title"]; news.newsIntro = [dict objectForKey:@"intro"]; news.newsSourceUrl = [dict objectForKey:@"source_url"]; news.newsTime = [dict objectForKey:@"time"]; news.newsSource = [dict objectForKey:@"source"]; news.newsReadtimes = [[dict objectForKey:@"readtimes"] intValue]; news.newsAuthor = [dict objectForKey:@"auther"]; NSArray *array = [dict objectForKey:@"images"]; |
这样就拿到了模型化的数据
代码请查看 http://git.oschina.net/zcb1603999/LearningiOS
转载请注明:怼码人生 » iOS学习笔记(二十七)————数据解析