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.urlNSURL *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];// 设置videoidself.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  真正解析结束 可以在主线程更新uidispatch_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

 

转载于:https://www.cnblogs.com/pengpengzhang/p/4843594.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Termux安装SSH结合内网穿透实现远程SFTP文件传输

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

linux上clisp运行lisp,apache - 重新访问linux + apache2 + mod_lisp + CLISP - 堆栈内存溢出

CLISP已安装并成功运行&#xff1a;(加载“ modlisp-clisp”)(modlisp&#xff1a;modlisp-server)运行正常&#xff0c;即无休止Python可通过localhost在/ usr / lib / cgi-bin中正常工作试图使clisp服务器在/ var / www / html / lsp中工作通过localhost / lsp打印的浏览器访…

linux解压war包乱码,linux中zip解压乱码解决方法

在windows上压缩的文件&#xff0c;是以系统默认编码中文来压缩文件。由于zip文件中没有声明其编码&#xff0c;所以linux上的unzip一般以默认编码解压&#xff0c;中文文件名会出现乱码。有2种方式解决问题&#xff1a;1、通过unzip行命令解压&#xff0c;指定字符集unzip -O …

Android沉浸式通知栏设计

转载博客&#xff1a;http://www.2cto.com/kf/201503/381348.html Android4.4新特性&#xff0c;系统状态栏一体化。 实现的步骤主要有以下几点&#xff1a; 1.android4.4 以上版本 2.设置app全屏&#xff1a; 方法&#xff1a;在AndroidManifest.xml中设置android:theme"…

linux火狐自动更新,CentOS 7手动更新firefox | Linux系统运维联盟

这里针对的是firefox无法检测到新版本&#xff0c;需要手动升级。1.下载新版的irefox&#xff0c;一般是.tar.gz压缩包。2.tar zxvf 解压到/usr/lib64 。(只要是原版firefox文件的目录就对了)3.cd /usr/lib64/firefox4../firefox-bin 完成有的更新好之后可能会无法播放视频&a…

C/C++02: Josephus问题

据说著名犹太历史学家Josephus有过以下的故事&#xff1a;在罗马人占领乔塔帕特後&#xff0c;39个犹太人与Josephus及他的朋友躲到一个洞中&#xff0c;39个犹太人决定宁愿死也不要被人抓到&#xff0c;于是决定了一个自杀方式&#xff0c;41个人排成一个圆圈&#xff0c;由第…

ahci模式下无法启动Linux,电脑AHCI模式无法开启是怎么回事?

安装之前就要开启ahci&#xff0c;然后安装系统&#xff0c;如果在ide模式下安装了&#xff0c;是不能随意的改到ahci的&#xff01;你的情况只能重装系统解决了&#xff01;看看你的主板&#xff0c;有没有第三方芯片的sata口&#xff0c;如果有&#xff0c;你把第三方芯片的s…

LeetCode Solutions : Reorder List

Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do this in-place without altering the nodes values. For example, Given {1,2,3,4}, reorder itto {1,4,2,3}. Considering the following steps: * 1. split…

双系统linux触摸板不能用,windows系统与ubuntu双系统导致笔记本触摸板失灵的解决办法(非输入代码)...

先说一下我现在的笔记本使用的系统&#xff0c;windows10 64位&#xff0b;ubuntu14.04 64位。这几天把ubuntu装好后本来毫无问题的&#xff0c;用的飞起&#xff5e;可是昨天不知道什么原因&#xff0c;触摸板突然失灵了&#xff0c;插上鼠标可以用&#xff0c;就是触摸板不能…

JS 入门经典 第三章 判断、循环和函数

1、比较运算符 在所有的比较运算符中&#xff0c;和&#xff01;的优先级最低&#xff0c;而>、<、<、>则具有相同的优先级 所有的比较运算度的优先级都比算数运算符要低&#xff0c;所以先执行算数运算符&#xff0c;在执行比较运算符。 2、字符串的比较 JS将按照…

linux c fifo阻塞写和非阻塞写,linux—FIFO的使用与非阻塞标志(O_NONBLOCK)的影响

FIFO文#include #include int mkfifo( const char*pathname, mode_t mode);参数&#xff1a;pathname&#xff1a;FIFO的路径名文件名。mode&#xff1a;mode_t类型的权限描述符&#xff0c;同open的参数。返回值&#xff1a;成功&#xff1a;返回0失败&#xff1a;如果文件已经…

Servlet的学习之Request请求对象(2)

在上一篇《Servlet的学习(十)》中介绍了HttpServletRequest请求对象的一些常用方法&#xff0c;而从这篇起开始介绍和学习HttpServletRequest的常用功能。 使用HttpServletRequest可以防止盗链行为&#xff0c;什么是盗链行为&#xff0c;比如说在一个别的网站上超链接&#xf…

如何提高linux的时钟精度,Linux时钟精度提高有什么办法?

2 动态高精度时钟设计和实现动态高精度时钟设计方案借鉴了KURT-Linux思想&#xff0c;但与其不同的是提供一个与标准Linux核心时钟并行的具有精密刻度的实时时钟&#xff0c;并与原核心时钟区别开。采用X86体系CPU提供的TSC作为高精度的时间标度&#xff0c;权衡一定时间段(如一…

c语言循环程序怎么编程,c语言程序(5):循环结构程序设计

#include #include #include /*循环结构:1.基本循环语句while循环do_while循环for循环1.1 所有的的循环&#xff0c;都是满足条件循环1.2 while循环while(条件){循环体;}1.3 kbhit() :监测键盘是否按键&#xff0c;1.4do{循环体;}while(count<3);1.5 for循环for(表达式1;表达…

Java基础知识强化之网络编程笔记05:UDP之多线程实现聊天室案例

1. 通过多线程改进刚才的聊天程序&#xff0c;这样我就可以实现在一个窗口发送和接收数据了 2. 代码示例&#xff1a; &#xff08;1&#xff09;SendThread.java&#xff0c;如下&#xff1a; 1 package com.himi.udpDemo2;2 3 import java.io.BufferedReader;4 import java.…

c语言宿舍管理设计报告,C语言课程设计—学生宿舍管理系统设计报告.doc

word格式精心整理版范文范例 学习指导课 程 设 计 报 告课程名称 C语言程序设计课题名称 学生宿舍管理系统专 业班 级学 号姓 名指导教师2012年6月19日湖南工程学院课 程 设 计 任 务 书课程名称 C语言程序设计课 题 学生宿舍管理系统专业班级学生姓名学 号指导老师审 批任务书…

EF编辑

//修改推荐的信息 var productRe db.Shop_ProductRecommends.Single(item > item.Id model.Id); productRe.seat model.seat; db.Set<Shop_ProductRecommends>().Attach(productRe); db.Entry(productRe).State EntityState.Modified;转载于:https://www.cnblogs.…

考勤管理系统c语言,C语言课程设计学生考勤系统最终版(范文1)

《C语言课程设计学生考勤系统.doc》由会员分享&#xff0c;可免费在线阅读全文&#xff0c;更多与《C语言课程设计学生考勤系统(最终版)》相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索。1、&#xff1b;return(head)&#xff1b;}voidenter()*录入函数*{structS…

关于类和接口的一些小笔记

如果一个类实现了多个接口&#xff0c;如果将这个类实例化&#xff0c;那么这些接口之间可以互相调用的。转载于:https://www.cnblogs.com/pilihaotian/p/4868609.html

汇编语言调用c语言ads,ADS1.2 在汇编代码中调用C函数

EDA365欢迎您登录&#xff01;您需要 登录 才可以下载或查看&#xff0c;没有帐号&#xff1f;注册x, U) b) } U8 \" d/ v( \$ ~ T对于ARM体系来说&#xff0c;不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard)&#xff0c;…