SAX for XML

前端之家收集整理的这篇文章主要介绍了SAX for XML前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. #import "ViewController.h"
  2. #import "VideoModel.h"
  3.  
  4. @interface ViewController () <NSXMLParserDelegate>
  5.  
  6. @end
  7.  
  8. @implementation ViewController {
  9.  
  10. /// 模型数组
  11. NSMutableArray *_videoM;
  12. /// 拼接节点之间的内容
  13. NSMutableString *_stringM;
  14. /// 定义全局的模型
  15. VideoModel *_currentModel;
  16. }
  17.  
  18. - (void)viewDidLoad {
  19. [super viewDidLoad];
  20.  
  21. /// 实例化模型数组
  22. _videoM = [NSMutableArray array];
  23. _stringM = [NSMutableString string];
  24.  
  25. [self loadData];
  26. }
  27.  
  28. - (void)loadData
  29. {
  30. // 1.URL
  31. NSURL *URL = [NSURL URLWithString:@"http://localhost/videos.xml"];
  32.  
  33. // 2.session发起和启动任务
  34. [[[NSURLSession sharedSession] dataTaskWithURL:URL completionHandler:^(NSData * _Nullable data,NSURLResponse * _Nullable response,NSError * _Nullable error) {
  35.  
  36. // 3.处理了响应
  37. if (error == nil && data != nil) {
  38.  
  39. // 反序列化 : SAX方式解析XML
  40. // 1.创建XML解析器
  41. NSXMLParser *XMLParser = [[NSXMLParser alloc] initWithData:data];
  42. NSXMLParser *xmlparser = [[NSXMLParser alloc]initWithData:data];
  43. // 2.遵守XML解析器
  44. XMLParser.delegate = self;
  45. // 3.开启解析器
  46. [XMLParser parse];
  47.  
  48. } else {
  49. NSLog(@"%@",error);
  50. }
  51.  
  52. }] resume];
  53. }
  54.  
  55. #pragma mark - NSXMLParserDelegate
  56.  
  57. // 1.开始解析XML文档
  58. - (void)parserDidStartDocument:(NSXMLParser *)parser
  59. {
  60. NSLog(@"1.开始解析XML文档");
  61. }
  62.  
  63. /// 提示 : 代理方法的2-3-4一直在循环的解析XML!!!!!
  64.  
  65. // 2.找开始节点
  66. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
  67. {
  68. // elementName : 开始节点名称
  69. // attributeDict : 节点的属性
  70. // NSLog(@"2.找开始节点 = %@ - %@",elementName,attributeDict);
  71.  
  72. // 只有找到<video>标签时,才创建`对应`的模型对象
  73. if ([elementName isEqualToString:@"video"]) {
  74. // 创建<video>标签`对应`的模型对象
  75. _currentModel = [[VideoModel alloc] init];
  76. // 给模型的videoId属性赋值 : 因为只有在这里可以拿到videoId
  77. _currentModel.videoId = attributeDict[@"videoId"];
  78. // 把创建的模型对象添加到模型数组videoM
  79. [_videoM addObject:_currentModel];
  80. }
  81. }
  82.  
  83. // 3.找节点之间内容 : 并非一次都能够找全的,完整的节点之间的内容需要拼接
  84. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
  85. {
  86. // string : 节点之间的内容
  87. // NSLog(@"3.找节点之间内容 = %@",string);
  88.  
  89. // 循环拼接节点之间的内容 : 给模型的属性赋值完之后,一定要清空一次
  90. [_stringM appendString:string];
  91. }
  92.  
  93. // 4.找结束节点 : 能够找到结束节点,说明节点之间的内容已经肯定找全了
  94. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName
  95. {
  96. // elementName : 结束节点名称
  97. // NSLog(@"4.找结束节点 = %@",elementName);
  98.  
  99. // 每次找到一个结束节点,就给模型的属性付一次值;但是,<videos>和<video>标签不能赋值
  100. if ([elementName isEqualToString:@"videos"] || [elementName isEqualToString:@"video"]) {
  101. return;
  102. }
  103.  
  104. // 排除了不能给模型赋值的节点之后,剩下的都是可以正常给模型属性赋值的节点
  105. [_currentModel setValue:_stringM forKey:elementName];
  106.  
  107. // 清空拼接字符串的容器
  108. [_stringM setString:@""];
  109.  
  110. // 这样写相当于把不可变的字符串,赋值给可变的字符串
  111. // _stringM = @"";
  112.  
  113. // 这样写相当于把_stringM销毁了
  114. // _stringM = nil;
  115. }
  116.  
  117. // 5.结束解析XML文档
  118. - (void)parserDidEndDocument:(NSXMLParser *)parser
  119. {
  120. NSLog(@"5.结束解析XML文档");
  121.  
  122. NSLog(@"%@",_videoM);
  123. }
  124.  
  125. // 6.监听解析是否出错
  126. - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
  127. {
  128. NSLog(@"6.监听解析是否出错 = %@",parseError);
  129. }
  130.  
  131. - (void)didReceiveMemoryWarning {
  132. [super didReceiveMemoryWarning];
  133. // Dispose of any resources that can be recreated.
  134. }
  135.  
  136. @end

猜你在找的XML相关文章