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解析器解析. ...
随机推荐
- wamp下var_dump()相关问题
PHP 使用var_dump($arr)时 没有格式化输出. 原因是没有启用‘XDebug’扩展 [xdebug]zend_extension ="d:/wamp/bin/php/php7. ...
- JavaScript实现两小时倒计时
[构思] 因为只需要的是两小时,所以时间直接写死,然后通过setInterval每1000ms对时间进行减1操作 前期未考虑到当时分秒小于10的状态,所以后面又加上了一个checkTime()来进行限 ...
- G1收集器的收集原理
G1收集器的收集原理 来源 http://blog.jobbole.com/109170/ JVM 8 内存模型 原文:https://blog.csdn.net/bruce128/article/d ...
- MT【8】和e有关的一个极限
解答: 评:这里涉及到e有关的极限的单调性,求导数得:
- 洛谷P2619 Tree I
经典的k条白边MST 带权二分,按照套路我们要选择尽量少的白边. #include <cstdio> #include <algorithm> ; int D; struct ...
- Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) D. Labyrinth
http://codeforces.com/contest/1064/problem/D 向上/向下加0,向左/右加1, step = 0,1,…… 求的是最少的步数,所以使用bfs. step=k ...
- 异常处理(throw,throws,try,catch,finally)
一.异常 1.定义:程序在运行时出现的不正确的情况. 2.由来:问题也是生活中的事物,也可以被Java描述,并被封装成对象. 其实就是Java对不正常情况进行描述后的对象体现. 3.划分:Java对于 ...
- PHP iconv 解决utf-8和gb2312编码转换问题
就一个很简单的函数iconv();但是就是这个函数在网上找了很多例子,都无法成功转换,这是为什么呢? 终于皇天不负有心人,答案还是让我找到了. 网上的都是这样用的 <?php $co ...
- (Java)入门训练 斐波那契数列
问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...
- pyqt4
PyQt4 工具包简介1.1 关于本指南 这是一个入门级的 PyQt 指南.其目的在于引导读者快速上手 PyQt4 工具包.该指南在 Linux 环境下创建并通过测试. 关于 PyQt PyQt 是用 ...