XML解析方案
在iOS中,解析XML的手段有很多
苹果原生
NSXMLParser:SAX方式解析,使用简单
第三方框架
libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析
GDataXML:DOM方式解析,由Google开发,基于libxml2
XML解析方式的选择建议
大文件:NSXMLParser,libxml2
小文件:GDataXML,NSXMLParser,libxml2
1.使用NSXMLParser进行解析
//创建XML解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; //设置代理
parser.delegate = self; //开始解析XML(阻塞式的)
[parser parse];
需要实现NSXMLParserDelegate代理
开始解析XML文档
- (void)parserDidStartDocument:(NSXMLParser *)parser;
XML文档解析完毕
- (void)parserDidEndDocument:(NSXMLParser *)parser;
解析到某个元素的开头
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict;
解析到某个元素的结尾
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName;
我们一般在第三个代理方法(解析到某个元素的开头)进行数据的处理
if ([elementName isEqualToString:@"root"]) {
return;//不解析根元素
}
//利用MJExtension框架将属性字典转换成模型
DDZVideo *video = [DDZVideo mj_objectWithKeyValues:attributeDict];
[self.videos addObject:video];
2.使用GDataXML进行解析
因为GDataXML不能使用cocoaPods进行加载,
所以我们需要将GDataXML这个文件夹导入到项目中。
导入之后需要进行一些设置,否则将报错
// libxml includes require that the target Header Search Paths contain
//
// /usr/include/libxml2
//
// and Other Linker Flags contain
//
// -lxml2
1.在Build Settings中
往Header Search Paths添加
/usr/include/libxml2
2.在Build Settings中
往Other Linker Flags添加
-lxml2
3.将项目设置成ARC与MRC混编
//加载整个文档
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil]; //获得所有video元素
NSArray *elements = [doc.rootElement elementsForName:@"video"];
for (GDataXMLElement *ele in elements) {
DDZVideo *video = [[DDZVideo alloc] init];
//将里面的属性分别提取
video.name = [ele attributeForName:@"name"].stringValue;
video.url = [ele attributeForName:@"url"].stringValue;
video.image = [ele attributeForName:@"image"].stringValue;
video.length = [ele attributeForName:@"length"].stringValue.intValue;
[self.videos addObject:video];
NSLog(@"%@",video.name);
}
最新文章
- html5 formData上传 针对app端
- Java并发编程核心方法与框架-CountDownLatch的使用
- Maven打包附加配置文件
- .NET笔试面试题
- HTTP 笔记与总结(8)HTTP 与内容压缩
- 在RHEL5.4下安装ORACLE11G
- *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
- weblogic 12c 配置jvm的内存大小
- T-SQL切割字符串方法小结 2
- delete 指针
- jenkins+docker 持续构建非docker in docker jenkins docker svn maven
- mysql 5.7 laravel json类型数据相关操作
- H5利用pattern属性和oninvalid属性验证表单
- $PollardRho$ 算法及其优化详解
- Kettle转换或作业乱码
- Vim 的光标移动定位
- 3 differences between Savepoints and Checkpoints in Apache Flink
- [HNOI2010] 弹飞绵羊 (分块)
- python面向对象编程 继承 组合 接口和抽象类
- Required Integer parameter &#39;XXX&#39; is not present
热门文章
- iOS阶段学习第14天笔记(NSString与NSMutableString)
- SQL查询中in、exists、not in、not exists的用法与区别
- sql中 in , not in , exists , not exists效率分析
- Firemonkey TEdit 切换不同 KeyboardType 样式
- Scalaz(41)- Free :IO Monad-Free特定版本的FP语法
- 几个简单的js正则验证
- 高性能 Windows Socket 组件 HP-Socket v2.2.3 正式发布
- jstl标签2
- CSS3中DIV水平垂直居中-2(3)
- Extjs 使用fileupload插件上传文件 带进度条显示