iOS SAX解析XML
- 先从网络获取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(@"服务器内部错误");}}];
- 在注释为解析数据处开始解析网络获取的数据
// 给ViewController添加代理@interface ViewController () <NSXMLParserDelegate>@end// 解析数据NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];// 设置代理parser.delegate = self;// 开始执行代理方法[parser parse];
- 实现代理方法
// 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(@"解析出错");
}
- 构建实体类
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
- 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
- 在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];}
}
- 拼接保存每个节点中的内容
// 3. 找节点之间的内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {NSLog(@"3找节点之间的内容 %@", string);[self.string appendString:string];
}
- 将内容与对应的节点赋值,并将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:@""];
}
打印查看结果
结果.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相关推荐
- python 使用sax 解析xml 文件
这里不是说xml 的所以如果xml 不了解,可以百度大致看下即可, SAX知识了解 SAX (simple API for XML ) 有解析器和事件处理器 解析器负责读取XML文档,并向事件处理器 ...
- SAX解析XML文件
就目前来说,有三种方式可以解析XML文件:DOM.SAX.StAX.DOM将整个XML文件加载到内存中,并构建出节点树:应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点.属性等信息:这种方 ...
- android xml解析demo,Android解析自定义xml文件--Sax解析xml文件,测试demo(方案二)...
转载请注明出处:http://blog.csdn.net/droyon/article/details/9346657 Sax解析xml 以下是测试Demo 运行程序类 public class Te ...
- python输出价目表-Python:使用基于事件驱动的SAX解析XML
SAX的特点: 是基于事件的 API 在一个比 DOM 低的级别上操作 为您提供比 DOM 更多的控制 几乎总是比 DOM 更有效率 但不幸的是,需要比 DOM 更多的工作 基于对象和基于事件的接口 ...
- SAX解析XML 详解
JAVA 解析 XML 通常有两种方式,DOM 和 SAX.DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个 ...
- 使用SAX解析XML文件
关于使用SAX解析XML文件也没什么要说明的,直接上代码吧. 关键如下: public class PersonHandler extends DefaultHandler {private Stri ...
- [iOS] dom解析xml数据,拿到lt;gt;里面的值
[iOS] dom解析xml数据,拿到<>里面的值 <response result="success" timestamp="1338890206&q ...
- android 如何使用SAX解析XML
今天,简单讲讲android如何使用SAX解析XML . 昨天,我看代码时,看到了解析xml文档的代码,是使用SAX解析XML.但是我却不会使用SAX,于是在网上查找资料,最终解决了问题.这里记录一下 ...
- Java用SAX解析XML
2019独角兽企业重金招聘Python工程师标准>>> Myhandler package com.heli.xml.sax;/*** 用SAX解析XML的Handler*/ imp ...
最新文章
- 哈佛大学学生保持20个快乐的习惯
- 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )
- Codeforces Hello 2019 D. Makoto and a Blackboard[DP+数论+概率期望]
- Nginx URL重写(rewrite)配置及信息详解
- 【女生节】圆周率小数点后37373737位中,“37”出现的次数是?
- 递归实现指数型枚举(搜索)
- 通过bindservice方式调用服务方法里面的过程
- Linux时间子系统之五:低分辨率定时器的原理和实现
- Checkbox和RadioRadioButton及其实例
- PCWorld:火狐浏览器已宣告死亡【转】
- 前端项目:基于Nodejs+vue开发实现酒店管理系统
- 苹果 iPad 上如何设置和使用蓝牙鼠标?
- js定义一个函数,返回所有水仙花数
- Windows系统近年漏洞概况及攻击教程防御
- 从苏宁电器到卡巴斯基第35篇:番外篇——晒一晒病毒分析师的桌面(下)
- Qt之QVector基本用法
- 信号完整性之S参数(六)
- Echarts 修改X轴字体大小
- 总结:K8s之HPA
- 关联分析(Apriori算法) 面包 牛奶 尿布 啤酒 ...