在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. MT【70】图论的一些基本概念例题介绍

    此讲是纯粹竞赛,联赛二试题难度.仅供学有余力的学生看看.

  2. HGOI 20190303 题解

    /* 记一串数字真难. 5435 今天比赛又是hjcAK的一天. 今天开题顺序是312,在搞T1之前搞了T3 昨天某谷月赛真是毒瘤. 但是讲评的同学不错,起码T4看懂了... 构造最优状态然后DP的思 ...

  3. USACO 好题汇总

    背景 这里主要是用来针对USACO上的题目的二次汇总,因为我在刷题的过程中,有的题目我是可以很快想到解决方案的,对于这种题目,就没有必要深究了.但是有一些题目对于我来说还是有一些挑战的,可能用朴素的算 ...

  4. Python基础-简介一

    一.Python介绍 1. Python的应用领域及流行程度 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间, ...

  5. The 2016 ACM-ICPC Asia Beijing Regional Contest E - What a Ridiculous Election

    https://vjudge.net/contest/259447#problem/E bfs,k个限制条件以数组的额外k维呈现. #include <bits/stdc++.h> usi ...

  6. Quartz入门例子简介 从入门到菜鸟(一)

    转: Quartz入门例子简介 从入门到菜鸟(一) 2016年11月19日 22:58:24 爱种鱼的猫 阅读数:4039   刚接触quartz这个词并不是在学习过程中...而是WOW里面的界面插件 ...

  7. poj 3276(反转)

    传送门:Problem 3276 参考资料: [1]:挑战程序设计竞赛 先献上AC代码,题解晚上再补 题意: John有N头牛,这些牛有的头朝前("F"),有的朝后("B ...

  8. java配置、IntelliJ IDEA Ultimate激活、

    1.下载并安装 Java地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html IntelliJ IDEA地址:ht ...

  9. jdk8的特性stream().map()

    转: https://blog.csdn.net/sanchan/article/details/70753645 java8的optional的使用: http://www.jdon.com/ide ...

  10. Shell变量的取用、删除、取代与替换

    <<鸟哥的私房菜>> 注意: 通配符适用的地方:shell命令行或者shell脚本中 正则表达式适用的地方:字符串处理时,一般有一般正则和Perl正则. 在文本过滤工具里,都是 ...