截取案例中请求数据的部分,以加载成功模型数组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 开发的一款框架)
如果使用此第三方框架,需要进行一些配置:
(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];
}