1. 先从网络获取XML文件
    NSURL *url = [NSURL URLWithString:@"https://127.0.0.1/videos.xml"];NSURLRequest *request = [NSURLRequest requestWithURL:url];[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {if (connectionError) {NSLog(@"连接错误 %@", connectionError);return;}NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;if (httpResponse.statusCode == 200 || httpResponse.statusCode == 304) {// 解析数据} else {NSLog(@"服务器内部错误");}}];
  1. 在注释为解析数据处开始解析网络获取的数据
            // 给ViewController添加代理@interface ViewController () <NSXMLParserDelegate>@end// 解析数据NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];// 设置代理parser.delegate = self;// 开始执行代理方法[parser parse];
  1. 实现代理方法
// 1. 开始解析文档
- (void)parserDidStartDocument:(NSXMLParser *)parser {NSLog(@"1开始解析");
}// 2. 找开始节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {NSLog(@"2找开始节点 %@--%@", elementName, attributeDict);
}// 3. 找节点之间的内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {NSLog(@"3找节点之间的内容 %@", string);
}// 4. 找结束节点
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {NSLog(@"4找结束节点 %@", elementName);
}// 5. 结束解析文档
- (void)parserDidEndDocument:(NSXMLParser *)parser {NSLog(@"5结束解析");
}// 6. 解析出错
- (void) parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {NSLog(@"解析出错");
}
  1. 构建实体类
    Video.h
#import <Foundation/Foundation.h>@interface Video : NSObject
@property (nonatomic, strong) NSNumber *videoId;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSNumber *length;
@property (nonatomic, copy) NSString *videoURL;
@property (nonatomic, copy) NSString *imageURL;
@property (nonatomic, copy) NSString *desc;
@property (nonatomic, copy) NSString *teacher;@property (nonatomic, readonly) NSString *time;- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)videoWithDict:(NSDictionary *)dict;@end

video.m

#import "Video.h"@implementation Video- (instancetype)initWithDict:(NSDictionary *)dict {if (self = [super init]) {[self setValuesForKeysWithDictionary:dict];}return self;
}+ (instancetype)videoWithDict:(NSDictionary *)dict {return [[self alloc] initWithDict:dict];
}- (NSString *)time {int len = self.length.intValue;return [NSString stringWithFormat:@"%02d:%02d:%02d:", len / 3600, (len %3600) / 60, (len % 60) ];
}- (NSString *)description {return [NSString stringWithFormat:@"<%@ : %p> { videoId : %@, name : %@, length : %@, videoURL : %@, imageURL : %@, desc : %@, teacher : %@}", [self class], self, self.videoId, self.name, self.length, self.videoURL, self.imageURL, self.desc, self.teacher];
}@end
  1. XML解析成对象
@interface ViewController () <NSXMLParserDelegate>
// 保存XML数据
@property (nonatomic, strong) NSMutableArray *videos;
// 当前创建的video对象
@property (nonatomic, strong) Video *video;
// 保存当前节点内容
@property (nonatomic, copy) NSMutableString *string;
@end@implementation ViewController// 懒加载
- (NSMutableArray *)videos {if (_videos == nil) {_videos = [NSMutableArray arrayWithCapacity:10];}return _videos;
}- (NSMutableString *)string {if (_string == nil) {_string = [NSMutableString string];}return _string;
}
@end
  1. 在video节点时创建Video对象
// 2. 找开始节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {NSLog(@"2找开始节点 %@--%@", elementName, attributeDict);// 如果是video标签,创建video对象if ([elementName isEqualToString:@"video"]) {self.video = [[Video alloc] init];self.video.videoId = @([attributeDict[@"videoId"] intValue]);// 添加到数组中[self.videos addObject:self.video];}
}
  1. 拼接保存每个节点中的内容
// 3. 找节点之间的内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {NSLog(@"3找节点之间的内容 %@", string);[self.string appendString:string];
}
  1. 将内容与对应的节点赋值,并将string对象置空
// 4. 找结束节点
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {NSLog(@"4找结束节点 %@", elementName);// 判断标签是否有对应的属性if (![elementName isEqualToString:@"video"] && ![elementName isEqualToString:@"videos"]) {// 为节点赋值[self.video setValue:self.string forKey:elementName];}// 清空字符串[self.string setString:@""];
}
  1. 打印查看结果

    结果.png

videos.xml内容
<videos>
<video videoId="1">
<name>01.C语言-语法预览</name>
<length>320</length>
<videoURL>/itcast/videos/01.C语言-语法预览.mp4</videoURL>
<imageURL>/itcast/images/head1.png</imageURL>
<desc>C语言-语法预览</desc>
<teacher>李雷</teacher>
</video>
<video videoId="2">
<name>02.C语言-第一个C程序</name>
<length>2708</length>
<videoURL>/itcast/videos/02.C语言-第一个C程序.mp4</videoURL>
<imageURL>/itcast/images/head2.png</imageURL>
<desc>C语言-第一个C程序</desc>
<teacher>李雷</teacher>
</video>
<video videoId="3">
<name>03.C语言-函数</name>
<length>822</length>
<videoURL>/itcast/videos/03.C语言-函数.mp4</videoURL>
<imageURL>/itcast/images/head3.png</imageURL>
<desc>C语言-函数</desc>
<teacher>韩梅梅</teacher>
</video>
<video videoId="4">
<name>04.C语言-基本数据类型</name>
<length>1113</length>
<videoURL>/itcast/videos/04.C语言-基本数据类型.mp4</videoURL>
<imageURL>/itcast/images/head4.png</imageURL>
<desc>C语言-基本数据类型</desc>
<teacher>韩梅梅</teacher>
</video>
<video videoId="5">
<name>05.C语言-基本运算</name>
<length>594</length>
<videoURL>/itcast/videos/05.C语言-基本运算.mp4</videoURL>
<imageURL>/itcast/images/head5.png</imageURL>
<desc>C语言-基本运算</desc>
<teacher>韩梅梅</teacher>
</video>
<video videoId="6">
<name>06.C语言-数组</name>
<length>923</length>
<videoURL>/itcast/videos/06.C语言-数组.mp4</videoURL>
<imageURL>/itcast/images/head6.png</imageURL>
<desc>C语言-数组</desc>
<teacher>韩梅梅</teacher>
</video>
<video videoId="7">
<name>07.C语言-字符串</name>
<length>848</length>
<videoURL>/itcast/videos/07.C语言-字符串.mp4</videoURL>
<imageURL>/itcast/images/head7.png</imageURL>
<desc>C语言-字符串</desc>
<teacher>韩梅梅</teacher>
</video>
<video videoId="8">
<name>08.C语言-指针</name>
<length>502</length>
<videoURL>/itcast/videos/08.C语言-指针.mp4</videoURL>
<imageURL>/itcast/images/head8.png</imageURL>
<desc>C语言-指针</desc>
<teacher>韩梅梅</teacher>
</video>
<video videoId="9">
<name>09.C语言-指针用例</name>
<length>558</length>
<videoURL>/itcast/videos/09.C语言-指针用例.mp4</videoURL>
<imageURL>/itcast/images/head1.png</imageURL>
<desc>C语言-指针用例</desc>
<teacher>韩梅梅</teacher>
</video>
<video videoId="10">
<name>10.C语言-指针与数组</name>
<length>1682</length>
<videoURL>/itcast/videos/10.C语言-指针与数组.mp4</videoURL>
<imageURL>/itcast/images/head2.png</imageURL>
<desc>C语言-指针与数组</desc>
<teacher>韩梅梅</teacher>
</video>
<video videoId="11">
<name>11.C语言-指针与字符串</name>
<length>1092</length>
<videoURL>/itcast/videos/11.C语言-指针与字符串.mp4</videoURL>
<imageURL>/itcast/images/head3.png</imageURL>
<desc>C语言-指针与字符串</desc>
<teacher>韩梅梅</teacher>
</video>
</videos>

iOS SAX解析XML相关推荐

  1. python 使用sax 解析xml 文件

    这里不是说xml 的所以如果xml 不了解,可以百度大致看下即可, SAX知识了解 SAX (simple API for XML )  有解析器和事件处理器 解析器负责读取XML文档,并向事件处理器 ...

  2. SAX解析XML文件

    就目前来说,有三种方式可以解析XML文件:DOM.SAX.StAX.DOM将整个XML文件加载到内存中,并构建出节点树:应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点.属性等信息:这种方 ...

  3. android xml解析demo,Android解析自定义xml文件--Sax解析xml文件,测试demo(方案二)...

    转载请注明出处:http://blog.csdn.net/droyon/article/details/9346657 Sax解析xml 以下是测试Demo 运行程序类 public class Te ...

  4. python输出价目表-Python:使用基于事件驱动的SAX解析XML

    SAX的特点: 是基于事件的 API 在一个比 DOM 低的级别上操作 为您提供比 DOM 更多的控制 几乎总是比 DOM 更有效率 但不幸的是,需要比 DOM 更多的工作 基于对象和基于事件的接口 ...

  5. SAX解析XML 详解

    JAVA 解析 XML 通常有两种方式,DOM 和 SAX.DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个 ...

  6. 使用SAX解析XML文件

    关于使用SAX解析XML文件也没什么要说明的,直接上代码吧. 关键如下: public class PersonHandler extends DefaultHandler {private Stri ...

  7. [iOS] dom解析xml数据,拿到lt;gt;里面的值

    [iOS] dom解析xml数据,拿到<>里面的值 <response result="success" timestamp="1338890206&q ...

  8. android 如何使用SAX解析XML

    今天,简单讲讲android如何使用SAX解析XML . 昨天,我看代码时,看到了解析xml文档的代码,是使用SAX解析XML.但是我却不会使用SAX,于是在网上查找资料,最终解决了问题.这里记录一下 ...

  9. Java用SAX解析XML

    2019独角兽企业重金招聘Python工程师标准>>> Myhandler package com.heli.xml.sax;/*** 用SAX解析XML的Handler*/ imp ...

最新文章

  1. 哈佛大学学生保持20个快乐的习惯
  2. 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )
  3. Codeforces Hello 2019 D. Makoto and a Blackboard[DP+数论+概率期望]
  4. Nginx URL重写(rewrite)配置及信息详解
  5. 【女生节】圆周率小数点后37373737位中,“37”出现的次数是?
  6. 递归实现指数型枚举(搜索)
  7. 通过bindservice方式调用服务方法里面的过程
  8. Linux时间子系统之五:低分辨率定时器的原理和实现
  9. Checkbox和RadioRadioButton及其实例
  10. PCWorld:火狐浏览器已宣告死亡【转】
  11. 前端项目:基于Nodejs+vue开发实现酒店管理系统
  12. 苹果 iPad 上如何设置和使用蓝牙鼠标?
  13. js定义一个函数,返回所有水仙花数
  14. Windows系统近年漏洞概况及攻击教程防御
  15. 从苏宁电器到卡巴斯基第35篇:番外篇——晒一晒病毒分析师的桌面(下)
  16. Qt之QVector基本用法
  17. 信号完整性之S参数(六)
  18. Echarts 修改X轴字体大小
  19. 总结:K8s之HPA
  20. 关联分析(Apriori算法) 面包 牛奶 尿布 啤酒 ...

热门文章

  1. Golang 的跨平台交叉编译浅析
  2. [Apache Tomcat]server.xml文件详解
  3. Oracle执行计划中 并行和BUFFER SORT的问题
  4. 82.开始→运行→输入的命令集锦
  5. docker自定义端口挂载目录
  6. Jar包部署-修改插件版本
  7. SpringSecurity分布式整合之实现思路分析
  8. SpringAMQP--FanoutExchange
  9. MySQL 数据存储文件
  10. 权限操作-springSecurity快速入门