在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);
}

最新文章

  1. html5 formData上传 针对app端
  2. Java并发编程核心方法与框架-CountDownLatch的使用
  3. Maven打包附加配置文件
  4. .NET笔试面试题
  5. HTTP 笔记与总结(8)HTTP 与内容压缩
  6. 在RHEL5.4下安装ORACLE11G
  7. *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
  8. weblogic 12c 配置jvm的内存大小
  9. T-SQL切割字符串方法小结 2
  10. delete 指针
  11. jenkins+docker 持续构建非docker in docker jenkins docker svn maven
  12. mysql 5.7 laravel json类型数据相关操作
  13. H5利用pattern属性和oninvalid属性验证表单
  14. $PollardRho$ 算法及其优化详解
  15. Kettle转换或作业乱码
  16. Vim 的光标移动定位
  17. 3 differences between Savepoints and Checkpoints in Apache Flink
  18. [HNOI2010] 弹飞绵羊 (分块)
  19. python面向对象编程 继承 组合 接口和抽象类
  20. Required Integer parameter &#39;XXX&#39; is not present

热门文章

  1. iOS阶段学习第14天笔记(NSString与NSMutableString)
  2. SQL查询中in、exists、not in、not exists的用法与区别
  3. sql中 in , not in , exists , not exists效率分析
  4. Firemonkey TEdit 切换不同 KeyboardType 样式
  5. Scalaz(41)- Free :IO Monad-Free特定版本的FP语法
  6. 几个简单的js正则验证
  7. 高性能 Windows Socket 组件 HP-Socket v2.2.3 正式发布
  8. jstl标签2
  9. CSS3中DIV水平垂直居中-2(3)
  10. Extjs 使用fileupload插件上传文件 带进度条显示