iOS学习笔记(二十七)————数据解析

/ 0评 / 0

有了网络请求,那就能够拿到服务器上的资源数据了,我们拿到的数据一般有两种格式 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"];

这样就拿到了模型化的数据

代码请查看 http://git.oschina.net/zcb1603999/LearningiOS

评论已关闭。