在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. ef 仓储模式 Redis

    接着写一下 上一章提到的 BaseRepositoryRedis.cs 先说说题外话:由于公司希望用到缓存来提高访问速度.那么我理所当然的想到redis. 这个无可厚非.可是当时我们的项目已经开发的差 ...

  2. SSM poi通过模板 反射导出excel

    1 import java.lang.reflect.Field; 2 import java.lang.reflect.Method; 3 import java.util.Iterator; 4 ...

  3. BZOJ2150 部落战争 【带上下界最小流】

    题目链接 BZOJ2150 题解 复习: 带上下界网络流两种写法: 不建\(T->S\)的\(INF\)的边,即不考虑源汇点,先求出此时超级源汇的最大流,即无源汇下最大的自我调整,再加入该边,求 ...

  4. 【Codeforces 98E】 Help Shrek and Donkey

    http://codeforces.com/problemset/problem/98/E (题目链接) 题意 A君有n张牌,B君有m张牌,桌上还有一张反扣着的牌,每张牌都不一样. 每个回合可以做两件 ...

  5. Matlab 沿三维任意方向切割CT图的仿真计算

    一.数据来源 头部组织的数据.此处直接引用了matlab自带的mri数据.实际场景中,可以通过CT得到的数据进行转换得到 插入异物的数据.此处我假设插入异物为一根细铁丝.模拟为空间中的一条曲线.这个曲 ...

  6. android sqlite批量插入数据速度解决方案

    转自 http://hi.baidu.com/hfutonline/blog/item/62b1e4de8bdf4b2e5882dd28.html 最近在做android项目的时候遇到一个问题,应用程 ...

  7. Linux中如何运行.AppImage文件

    今天在GitHub上发现了一个upterm( https://github.com/railsware/upterm )的开源项目,和其他的并不太一样,对于Linux发行版本只提供了AppImage的 ...

  8. C# HasRows 和 Read的区别

    HasRows:返回true或者false,表示从数据库中读取出来的数据集DataRead是否存在,用来判断是否为空: Read:返回true或者false,Read才是真正的读数据,采用的是顺序读法 ...

  9. [noip][2017]

    Day1T1 30分思路: 倒着枚举答案z,用扩展欧几里得求解,如果能找到两个非负整数x,y使得ax+by=z则继续枚举,直到无解为止 100分: 最适用与考场上的做法,根据30分思路打表找规律. 3 ...

  10. react实现删除输入框内容

    react中实现删除输入框中的内容 import React,{Component} from 'react' class Clear extends Component{ constructor(p ...