在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 解析的更多相关文章

  1. iOS 中的XML解析代码(SAX)

    1.XML解析(SAX) NSXMLParser SAX 大文件 1)打开文档 - (void)parserDidStartDocument:(NSXMLParser *)parser 2)开始查找起 ...

  2. IOS中的XML解析之DOM和SAX

    一.介绍 dom是w3c指定的一套规范标准,核心是按树形结构处理数据,dom解析器读入xml文件并在内存中建立一个结构一模一样的“树”,这树各节点和xml各标记对应,通过操纵此“树”来处理xml中的文 ...

  3. iOS - - JSON 和 XML解析

    JSON 和 XML 一.JSON 1.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) 2.JSON的格 ...

  4. 解决在php5中simple XML解析错误的问题

    2004年7月,php5正式版本的发布,标志着一个全新的PHP时代的到来.PHP5的最大特点是引入了面向对象的全部机制,并且保留了向下的兼容性.程序员不必再编写缺乏功能性的类,并且能够以多种方法实现类 ...

  5. iOS边练边学--iOS中的XML数据解析

    XML的解析方式 SAX 大小文件都可以 NSXMLParser DOM 最好是小文件 GDataXML NSXMLParser的用法 创建解析器来解析 // 创建XML解析器 NSXMLParser ...

  6. Android中的XML解析

    在安卓中主要有三种XML文档解析方式:DOM(Document Object Model), SAX(Simple API for XML), PULL 他们的主要特点如下表:   特点 主要类 DO ...

  7. ios之json,xml解析

    JSON解析步骤: 1.获取json文件路径 NSString*path = [[NSBundle mainBundle] pathForResource:@"Teacher"of ...

  8. PHP中的XML解析的5种方法

    [前言]不管是桌面软件开发,还是WEB应用,XML无处不在!然而在平时的工作中,仅仅是使用一些已经封装好的类对XML对于处理,包括生成,解析等.假期有空,于是将PHP中的几种XML解析方法总结如下: ...

  9. ibatis配置文件中的XML解析错误The content of elements must consist of well-formed character data or markup.

    在检查过所有的标签名都没有问题的情况下. xml中的小于号属于非法字符. SQL语句中则可能需要小于号,此时就需要用<![CDATA[  ]]>将小于号包裹,如此不会被xml解析器解析. ...

随机推荐

  1. Java生成数独函数

    突然想写一下生成算法.代码注释的比较多,应该比较好理解 使用了递归 import java.util.ArrayList; public class Sudoku { static int sudok ...

  2. jupyter快捷键

    jupyter快捷键(jupyter有两个模式,命令模式和编辑模式) 当前cell侧边为蓝色时,表示此时为命令模式,按Enter切换为编辑模式 当前cell侧边为绿色时,表示此时为编辑模式,按Esc切 ...

  3. BZOJ 2159: Crash 的文明世界(树形dp+第二类斯特林数+组合数)

    题意 给定一棵 \(n\) 个点的树和一个常数 \(k\) , 对于每个 \(i\) , 求 \[\displaystyle S(i) = \sum _{j=1} ^ {n} \mathrm{dist ...

  4. 【BZOJ2434】【NOI2011】阿狸的打字机(AC自动机,树状数组)

    [BZOJ2434]阿狸的打字机(AC自动机,树状数组) 先写个暴力: 每次打印出字符串后,就插入到\(Trie\)树中 搞完后直接搭\(AC\)自动机 看一看匹配是怎么样的: 每次沿着\(AC\)自 ...

  5. 【BZOJ2111】[ZJOI2010]排列计数(组合数学)

    [BZOJ2111][ZJOI2010]排列计数(组合数学) 题面 BZOJ 洛谷 题解 就是今年九省联考\(D1T2\)的弱化版? 直接递归组合数算就好了. 注意一下模数可以小于\(n\),所以要存 ...

  6. 洛谷 P3313 [SDOI2014]旅行 解题报告

    P3313 [SDOI2014]旅行 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教 ...

  7. NHibernate使用简单示例

    NHibernate使用小示例 1.新建Model类库项目. 使用代码生成器生成Model类. 此处以简单的UserInfo表作为示例. 注意字段前必须以 virtual 修饰. namespace ...

  8. BSGS

    北上广深/拔山盖世算法. yaT+b = z mod p p为质数,Hash表存b,枚举a,复杂度p0.5 记得特判y = 0的情况. inline void solve3() { Hash::cle ...

  9. MATLAB:增加噪声,同时多次叠加噪声图和原图以及求平均图像(imnoise,imadd函数)

    本次涉及了对原图像增加高斯噪声.多次叠加原图和高斯噪声图以及叠加后的平均图像. close all; %关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clear all; clc; R ...

  10. nginx下后端节点realserverweb健康检测模块ngx_http_upstream_check_module

    本文章收录做资料使用,非本人原创,特此说明. 公司前一段对业务线上的nginx做了整理,重点就是对nginx上负载均衡器的后端节点做健康检查.目前,nginx对后端节点健康检查的方式主要有3种,这里列 ...