iOS 【网端数据解析 JSON(MJExtension)& XML(NSXMLParser/GDataParser)】

截取案例中请求数据的部分,以加载成功模型数组self.videos为准。

① JSON 解析 —— MJExtension

- (void)getData {
    // 请求数据JSON解析,并保存到模型数组中
    [[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/video?type=JSON"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        //        NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); // 检查结果为字典
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
        //        NSLog(@"%@", dict);
        
        NSArray *arr = dict[@"videos"];
        
        // 将模型中的ID属性用id替换一下
        [WZYVideo mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
            return @{@"ID" : @"id"};
        }];
        
        self.videos = [WZYVideo mj_objectArrayWithKeyValuesArray:arr];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView reloadData];
        });
        
    }] resume];
}


② XML 解析 —— NSXMLParser(系统自带的解析XML的类)

- (void)getData {
    // 请求数据JSON解析,并保存到模型数组中
    [[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        
        // XML解析(XML和JSON在本质上就是字符串,带有特殊格式的字符串)
        // 1 创建解析器
        NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
        // 2 设置delegate
        parser.delegate = self;
        // 3 开始解析
        [parser parse];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView reloadData];
        });
        
    }] resume];
}
该方法需要配合 NSXMLParserDelegate 一起使用
#pragma mark - NSXMLParserDelegate
//01 开始解析XML文档的时候调用
- (void)parserDidStartDocument:(NSXMLParser *)parser {
    
    NSLog(@"parserDidStartDocument---开始解析XML文档");
}

//02 开始解析某个元素的时候调用 该方法会调用多次
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
    
    NSLog(@"didStartElement---开始解析单个元素---%@, %@", elementName, attributeDict);
    
    
    if ([elementName isEqualToString:@"videos"]) {
        return;
    }
    
    //01 把字典转换为模型
    WZYVideo *video = [WZYVideo mj_objectWithKeyValues:attributeDict];
    
    //02 把模型添加到数组
    [self.videos addObject:video];
}

//03 某个元素解析完毕的时候调用  该方法会调用多次
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"didEndElement---单个元素解析完毕");
}

//04 整个XML文档解析完毕的时候调用
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSLog(@"parserDidEndDocument---整个XML文档解析完毕");
    
//    dispatch_async(dispatch_get_main_queue(), ^{
//        [self.tableView reloadData];
//    });
}

③ XML 解析 —— GDataParser(Google 开发的一款框架)

如果使用此第三方框架,需要进行一些配置:


(1)GDataXML 框架是MRC的,所以还需要告诉编译器以MRC的方式处理GDataXML的代码



(2)设置libxml2的头文件搜索路径(为了能找到libxml2库的所有头文件)



(3)设置链接参数(自动链接libxml2库)



- (void)getData {
    // 请求数据XML解析,并保存到模型数组中
    [[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        //GDataXML来解析数据
        //01 加载整个XML文档
        GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil];
        
        //02 得到根元素 根据根元素得到内部所有名称为video的子元素(返回一个数组)
        NSArray *eles = [doc.rootElement elementsForName:@"video"];
        
        //03 遍历所有的子元素,得到子元素中的属性
        for (GDataXMLElement *ele in eles) {
            
            WZYVideo *video = [[WZYVideo alloc]init];
            video.ID = [ele attributeForName:@"id"].stringValue;
            video.image = [ele attributeForName:@"image"].stringValue;
            video.length = [ele attributeForName:@"length"].stringValue;
            video.name = [ele attributeForName:@"name"].stringValue;
            video.url = [ele attributeForName:@"url"].stringValue;
            
            [self.videos addObject:video];
            
        }
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView reloadData];
        });
        
    }] resume];
}



  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值