iOS 中的 xml 解析
在ios 中解析xml 的方法有很多种
1.苹果原生
NSXMLParser:SAX方式解析,使用简单
2.第三方框架
libxml2:纯c语言,默认包含在ios sdk中,同时支持DOM 和 SAX 方式解析
GDataXML : DOM方式解析,由谷歌开发,基于libxml2
xml 解析建议方式:
大文件选用:NSXMLParser 或者 libxml2
小文件选用:GDataXML
xml解析:
SAX方式解析:
从上往下,一点一点解析,性能比较好,也是苹果推荐使用的。
DOM方式解析
一次性将xml文档以树形结构读入内存,内存消耗比较大。适用于比较小的xml文件解析。在ios 开发中默认是不支持这种方式的解析。但是有一些第三方框架实现了这个方式,
KissXML & GData 都是采用DOM解析。
//
// ViewController.m
// 04-xml解析
//
// Created by jerry on 15/9/28.
// Copyright (c) 2015年 jerry. All rights reserved.
// #import "ViewController.h"
#import "Video.h"
@interface ViewController ()<NSXMLParserDelegate>
/**
* 整个xml的数据容器
*/
@property(nonatomic,strong)NSMutableArray *videos; /**
* 第三步拼接字符串
*/
@property(nonatomic,strong)NSMutableString *elementString;
/**
* 当前模型
*/
@property(nonatomic,strong)Video *currentVideo;
/**
* 专门用来存储表格所有的数据,也就是表格数据源
*/
@property(nonatomic,strong)NSMutableArray *dataList;
@end @implementation ViewController
@synthesize videos = _videos;
- (void)setDataList:(NSMutableArray *)dataList
{
_dataList = dataList;
// 只要重新赋值 就要刷新
[self.tableView reloadData];
// 隐藏刷新控件
[self.refreshControl endRefreshing];
}
/**
* 懒加载 初始化 自定义属性 */
-(NSMutableArray *)videos
{
if (_videos == nil) {
_videos = [NSMutableArray array];
}
return _videos;
}
/**
* 懒加载 初始化 自定义属性
*
* @return <#return value description#>
*/
- (NSMutableString *)elementString
{
if (_elementString == nil) {
_elementString = [NSMutableString string];
}
return _elementString;
}
//- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
// [self loadData];
//}
-(void)loadView
{
[super loadView]; [self loadData];
}
/**
* 加载xml 数据
* 从第2步到第4步,可以拿到video的属性。
*/
- (IBAction)loadData
{
// 1.url
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/videos.xml"]; // 2.请求
// 不采用这个请求的原因就是因为他会有缓存,每次加载会先找缓存数据,这样就会出现“幻觉”数据。
// NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 这样的请求 可以避免缓存数据,以免数据更改了 刷新ui 的时候还是显示原来的数据。
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:2.0f]; // 3.连接
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// xml 解析 // 1.实例化xml 解析器
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data]; // 2.设置代理
parser.delegate = self; // 3.开始解析
[parser parse]; }];
}
#pragma mark - 代理方法
/**
* 1.打开文档 准备开始解析
*
* @param parser <#parser description#>
*/
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
NSLog(@"打开文档");
// 初始化数组容器,清空容器,便于多次加载数据
[self.videos removeAllObjects];
} /**
* 2.开始节点
* 新建一个video对象,设置video的属性,
* @param parser <#parser description#>
* @param elementName 元素名称
* @param namespaceURI <#namespaceURI description#>
* @param qName <#qName description#>
* @param attributeDict <#attributeDict description#>
*/
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"开始节点---%@---%@",elementName,attributeDict); // 如果开始节点的名称是video 就创建一个对象。
if ([elementName isEqualToString:@"video"]) {
self.currentVideo =[[Video alloc]init];
// 设置videoid
self.currentVideo.videoId = attributeDict[@"videoId"];
}
// 清空字符串内容 因为马上要进行第3步,开始拼接当前节点内容
[self.elementString setString:@""];
}
/**
* 3.发现节点里面内容
*
* @param parser <#parser description#>
* @param string <#string description#>
*/
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"发现节点内容---%@",string);
// 开始拼接
[self.elementString appendString:string];
}
/**
* 4.结束节点
*
* @param parser <#parser description#>
* @param elementName <#elementName description#>
* @param namespaceURI <#namespaceURI description#>
* @param qName <#qName description#>
*/
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"结束节点---%@",elementName);
if ([elementName isEqualToString:@"video"]) {
// 如果结束节点是video 需要把这个对象添加到数组
[self.videos addObject:self.currentVideo];
}else if (![elementName isEqualToString:@"videos"])
{
// 利用kvc 进行赋值。可以省略注释掉的代码的麻烦。
[self.currentVideo setValue:self.elementString forKeyPath:elementName];
} // // 如果结束节点,就可以把第二步创建的对象进行赋值,设置name/length属性
// else if ([elementName isEqualToString:@"name"]) {
// // 设置name 属性
// self.currentVideo.name = self.elementString;
//
// }else if ([elementName isEqualToString:@"length"])
// {
// // 设置length属性
// // @([self.elementString integerValue]) 现将字符串转成 数字,然后再将数字专程number
// self.currentVideo.length = @([self.elementString integerValue]);
//
// }
}
/**
* 5.结束文档
*
* @param parser <#parser description#>
*/
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"结束文档");
// xml 真正解析结束 可以在主线程更新ui
dispatch_async(dispatch_get_main_queue(), ^{
self.dataList =self.videos;
});
} - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.videos.count;
}
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; Video *video = self.dataList[indexPath.row]; cell.textLabel.text = video.name; return cell;
} @end
iOS 中的 xml 解析的更多相关文章
- iOS 中的XML解析代码(SAX)
1.XML解析(SAX) NSXMLParser SAX 大文件 1)打开文档 - (void)parserDidStartDocument:(NSXMLParser *)parser 2)开始查找起 ...
- IOS中的XML解析之DOM和SAX
一.介绍 dom是w3c指定的一套规范标准,核心是按树形结构处理数据,dom解析器读入xml文件并在内存中建立一个结构一模一样的“树”,这树各节点和xml各标记对应,通过操纵此“树”来处理xml中的文 ...
- iOS - - JSON 和 XML解析
JSON 和 XML 一.JSON 1.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) 2.JSON的格 ...
- 解决在php5中simple XML解析错误的问题
2004年7月,php5正式版本的发布,标志着一个全新的PHP时代的到来.PHP5的最大特点是引入了面向对象的全部机制,并且保留了向下的兼容性.程序员不必再编写缺乏功能性的类,并且能够以多种方法实现类 ...
- iOS边练边学--iOS中的XML数据解析
XML的解析方式 SAX 大小文件都可以 NSXMLParser DOM 最好是小文件 GDataXML NSXMLParser的用法 创建解析器来解析 // 创建XML解析器 NSXMLParser ...
- Android中的XML解析
在安卓中主要有三种XML文档解析方式:DOM(Document Object Model), SAX(Simple API for XML), PULL 他们的主要特点如下表: 特点 主要类 DO ...
- ios之json,xml解析
JSON解析步骤: 1.获取json文件路径 NSString*path = [[NSBundle mainBundle] pathForResource:@"Teacher"of ...
- PHP中的XML解析的5种方法
[前言]不管是桌面软件开发,还是WEB应用,XML无处不在!然而在平时的工作中,仅仅是使用一些已经封装好的类对XML对于处理,包括生成,解析等.假期有空,于是将PHP中的几种XML解析方法总结如下: ...
- ibatis配置文件中的XML解析错误The content of elements must consist of well-formed character data or markup.
在检查过所有的标签名都没有问题的情况下. xml中的小于号属于非法字符. SQL语句中则可能需要小于号,此时就需要用<![CDATA[ ]]>将小于号包裹,如此不会被xml解析器解析. ...
随机推荐
- spring boot 系列之五:spring boot 通过devtools进行热部署
前面已经分享过四篇随笔: spring boot 系列之一:spring boot 入门 spring boot 系列之二:spring boot 如何修改默认端口号和contextpath spri ...
- codeforces 798 D. Mike and distribution
D. Mike and distribution time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- day24 包
# 把解决一类问题的模块会被放在一个文件夹里面,即包 # import os # os.makedirs('glance/api') # os.makedirs('glance/cmd') # os. ...
- 获取外网出口ip
curl ifconfig.me 或 curl cip.cc
- Java新AIO/NIO2:AsynchronousServerSocketChannel和AsynchronousSocketChannel简单服务器-客户端
Java新AIO/NIO2:AsynchronousServerSocketChannel和AsynchronousSocketChannel简单服务器-客户端用AsynchronousServerS ...
- OpenAI 开源机器人模拟 Python 库,并行模拟处理速度提升400%
10000da.cnvboyule.cnjiaeidaypt.cn 在过去一年的研究中,OpenAI团队开源一个使用 MuJoCoengine开发的用于机器人模拟的高性能Python库.雷锋网了解到 ...
- 自学Zabbix之路15.1 Zabbix数据库表结构简单解析-Hosts表、Hosts_groups表、Interface表
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix之路15.1 Zabbix数据库表结构简单解析-Hosts表.Hosts_grou ...
- MySql 主辅-一主多辅
MySql 主辅-一主多辅mysql tar源码包安装 骤及过程,以供参考 系统是centos6.x .注意:此安装是默认CentOS下已经安装了最新工具包,比如GNU make, GCC, Perl ...
- git 28原则
一.流程 $ git init # 创建一个新的仓库 sublime 编写文本,不要使用win自带文本编辑器 $ git add file1 # 将文件添加到暂存区 $ git add file2 $ ...
- Java中线程池的实现原理-求职必备
jdk1.5引入Executor线程池框架,通过它把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行.被哪个线程执行,以及什么时候执行. 初始化线程池(4种) ...