有了网络请求,那就能够拿到服务器上的资源数据了,我们拿到的数据一般有两种格式 xml 和 json ,下面看一下怎么解析这些数据
xml格式
先看一下xml的格式,其实就是标签对
1eer1eer1eer1eer1eer1eer
qtrrrrrrr
qd
to
to
to
1176910151
ke
1176910151
6
6
6
而我们的解析也是根据标签对来的
- (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格式
{
"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 这个类序列化成字典就可以取出数据了
// 我们这里从文件中读出来
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"];
这样就拿到了模型化的数据