- #import "ViewController.h"
- #import "VideoModel.h"
-
- @interface ViewController () <NSXMLParserDelegate>
-
- @end
-
- @implementation ViewController {
-
- /// 模型数组
- NSMutableArray *_videoM;
- /// 拼接节点之间的内容
- NSMutableString *_stringM;
- /// 定义全局的模型
- VideoModel *_currentModel;
- }
-
- - (void)viewDidLoad {
- [super viewDidLoad];
-
- /// 实例化模型数组
- _videoM = [NSMutableArray array];
- _stringM = [NSMutableString string];
-
- [self loadData];
- }
-
- - (void)loadData
- {
- // 1.URL
- NSURL *URL = [NSURL URLWithString:@"http://localhost/videos.xml"];
-
- // 2.session发起和启动任务
- [[[NSURLSession sharedSession] dataTaskWithURL:URL completionHandler:^(NSData * _Nullable data,NSURLResponse * _Nullable response,NSError * _Nullable error) {
-
- // 3.处理了响应
- if (error == nil && data != nil) {
-
- // 反序列化 : SAX方式解析XML
- // 1.创建XML解析器
- NSXMLParser *XMLParser = [[NSXMLParser alloc] initWithData:data];
- NSXMLParser *xmlparser = [[NSXMLParser alloc]initWithData:data];
- // 2.遵守XML解析器
- XMLParser.delegate = self;
- // 3.开启解析器
- [XMLParser parse];
-
- } else {
- NSLog(@"%@",error);
- }
-
- }] resume];
- }
-
- #pragma mark - NSXMLParserDelegate
-
- // 1.开始解析XML文档
- - (void)parserDidStartDocument:(NSXMLParser *)parser
- {
- NSLog(@"1.开始解析XML文档");
- }
-
- /// 提示 : 代理方法的2-3-4一直在循环的解析XML!!!!!
-
- // 2.找开始节点
- - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
- {
- // elementName : 开始节点名称
- // attributeDict : 节点的属性
- // NSLog(@"2.找开始节点 = %@ - %@",elementName,attributeDict);
-
- // 只有找到<video>标签时,才创建`对应`的模型对象
- if ([elementName isEqualToString:@"video"]) {
- // 创建<video>标签`对应`的模型对象
- _currentModel = [[VideoModel alloc] init];
- // 给模型的videoId属性赋值 : 因为只有在这里可以拿到videoId
- _currentModel.videoId = attributeDict[@"videoId"];
- // 把创建的模型对象添加到模型数组videoM
- [_videoM addObject:_currentModel];
- }
- }
-
- // 3.找节点之间内容 : 并非一次都能够找全的,完整的节点之间的内容需要拼接
- - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
- {
- // string : 节点之间的内容
- // NSLog(@"3.找节点之间内容 = %@",string);
-
- // 循环拼接节点之间的内容 : 给模型的属性赋值完之后,一定要清空一次
- [_stringM appendString:string];
- }
-
- // 4.找结束节点 : 能够找到结束节点,说明节点之间的内容已经肯定找全了
- - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName
- {
- // elementName : 结束节点名称
- // NSLog(@"4.找结束节点 = %@",elementName);
-
- // 每次找到一个结束节点,就给模型的属性付一次值;但是,<videos>和<video>标签不能赋值
- if ([elementName isEqualToString:@"videos"] || [elementName isEqualToString:@"video"]) {
- return;
- }
-
- // 排除了不能给模型赋值的节点之后,剩下的都是可以正常给模型属性赋值的节点
- [_currentModel setValue:_stringM forKey:elementName];
-
- // 清空拼接字符串的容器
- [_stringM setString:@""];
-
- // 这样写相当于把不可变的字符串,赋值给可变的字符串
- // _stringM = @"";
-
- // 这样写相当于把_stringM销毁了
- // _stringM = nil;
- }
-
- // 5.结束解析XML文档
- - (void)parserDidEndDocument:(NSXMLParser *)parser
- {
- NSLog(@"5.结束解析XML文档");
-
- NSLog(@"%@",_videoM);
- }
-
- // 6.监听解析是否出错
- - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
- {
- NSLog(@"6.监听解析是否出错 = %@",parseError);
- }
-
- - (void)didReceiveMemoryWarning {
- [super didReceiveMemoryWarning];
- // Dispose of any resources that can be recreated.
- }
-
- @end