
文档声明

语法

语法

语法

XML解析

XML解析
#import "ViewController.h"
#import "XMGVideo.h"
#import "MJExtension.h"
@interface ViewController ()<NSXMLParserDelegate>
@property (nonatomic,strong) NSMutableArray *videos;
@end
@implementation ViewController
-(NSMutableArray *)videos
{
if (_videos == nil) {
_videos = [NSMutableArray array];
}
return _videos;
}
- (void)viewDidLoad
{
[super viewDidLoad];
//01 确定请求路径
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
//02 创建会话对象
NSURLSession *session = [NSURLSession sharedSession];
//03 创建TASK 执行Task
[[session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//在进行字典转模型之前手动的设置替换 ID - id
[XMGVideo mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
return @{@"ID":@"id"};
}];
//04 解析服务器返回的数据
//001 创建XML解析器(NSXMLParser-SAX)
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
//002 设置代理
parser.delegate = self;
//003 开始解析 本身是阻塞式的
[parser parse];
//06 刷新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self.tableView reloadData];
}];
}] resume];
}
#pragma mark -----------------------
#pragma mark NSXMLParserDelegate
//01 开始解析XML文档的时候调用
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
NSLog(@"parserDidStartDocument");
}
//02 开始解析XML文档中某个元素的时候调用 该方法会调用多次
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
NSLog(@"didStartElement--开始解析的元素名称:%@\n%@",elementName,attributeDict);
//过滤掉根元素
if ([elementName isEqualToString:@"videos"]) {
return;
}
//001 把字典转换为模型
XMGVideo *video = [XMGVideo mj_objectWithKeyValues:attributeDict];
//002 把模型添加到全局的可变数组中保存起来
[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");
}
@end
-
GDataXML解析XML

第一步

第二步

非ARC尝试自动转换车ARC,不行的话手动转换

手动转成ARC
---------------------GDataXML解析XML-------------------------
- (void)viewDidLoad
{
[super viewDidLoad];
//01 确定请求路径
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
//02 创建会话对象
NSURLSession *session = [NSURLSession sharedSession];
//03 创建TASK 执行Task
[[session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//在进行字典转模型之前手动的设置替换 ID - id
[XMGVideo mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
return @{@"ID":@"id"};
}];
//04 解析服务器返回的数据 XML
//001 把整个XML文档加载进内存
GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil];
//002 先得到根元素,然后获取根元素内部所有名称为video的子元素
NSArray *eles = [doc.rootElement elementsForName:@"video"];
//03 遍历整个子元素数组,然后得到数组中每个元素的内部属性
for (GDataXMLElement *ele in eles) {
//创建模型
XMGVideo *video = [[XMGVideo alloc]init];
//得到子元素的属性
video.name = [ele attributeForName:@"name"].stringValue;
video.ID =[ele attributeForName:@"id"].stringValue;
video.length =[ele attributeForName:@"length"].stringValue;
video.image = [ele attributeForName:@"image"].stringValue;
video.url = [ele attributeForName:@"url"].stringValue;
//把模型保存到数据源
[self.videos addObject:video];
}
//06 刷新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self.tableView reloadData];
}];
}] resume];
}
网友评论