IOS 解析XML数据
● 全称是Extensible Markup Language,译作“可扩展标记语言”
● 跟JSON一样,也是常用的一种用于交互的数据格式
● 一般也叫XML文档(XML Document)
五、XML ====================总结============================
1.语法
1> 文档声明
<?xml version="1.0" encoding="UTF-8" ?>
2> 元素
3> 属性
<videos>
<video name="小黄人 第01部" length="10"/>
<video name="小黄人 第01部" length="10"/>
</videos>
* videos和video是元素(节点)
* name和length叫做元素的属性
* video元素是videos元素的子元素
2.解析
1> SAX解析:逐个元素往下解析,适合大文件
* NSXMLParser
2> DOM解析:一口气将整个XML文档加载进内存,适合小文件,使用最简单
* GDataXML
==================================================
● DOM:一次性将整个XML文档加载进内存,比较适合解析小文件(常用方式)
- (NSArray *)parseJSONData:(NSData *)data
{
// 解析数据
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSArray *array = dict[@"videos"]; NSMutableArray *videos = [NSMutableArray array];
for (NSDictionary *videoDict in array) {
HMVideo *video = [HMVideo videoWithDict:videoDict];
[videos addObject:video];
}
return videos;
}
● SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文 件
● 苹果原生
• NSXMLParser:SAX方式解析,使用简单
● 第三方框架
• libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析
• GDataXML:DOM方式解析,由Google开发,基于libxml2
● XML解析方式的选择建议
● 大文件:NSXMLParser、libxml2
● 小文件:GDataXML
NSXMLParser
// 传入XML数据,创建解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 设置代理,监听解析过程
parser.delegate = self;
// 开始解析
[parser parse];
● NSXMLParser采取的是SAX方式解析,特点是事件驱动,下面情况都会通知代理
● 当扫描到文档(Document)的开始与结束
● 当扫描到元素(Element)的开始与结束
- (NSArray *)SAXparseXMLWithData:(NSData *)data
{
// 1.创建解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; // 2.设置代理
parser.delegate = self; // 3.开始解析
[parser parse]; // 卡住(解析完毕才会返回) return self.videos;
}
NSXMLParserDelegate
- (void)parserDidStartDocument:(NSXMLParser *)parser
● 当扫描到文档的结束时调用(解析完毕)
- (void)parserDidEndDocument:(NSXMLParser *)parser
● 当扫描到元素的开始时调用(attributeDict存放着元素的属性)
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString
*)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:
(NSString *)qName attributes:(NSDictionary *)attributeDict
● 当扫描到元素的结束时调用
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString
*)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:
(NSString *)qName
#pragma mark - NSXMLParserDelegate
/**
* 开始解析文档时调用
*/
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
// NSLog(@"parserDidStartDocument----");
}
/**
* 结束解析文档时调用(解析完毕)
*/
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
// NSLog(@"parserDidEndDocument----");
} /**
* 解析到一个元素的开头时调用 <videos>
*/
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
// NSLog(@"didStartElement----%@", elementName);
if ([@"videos" isEqualToString:elementName]) { // 解析到一个videos标签
self.videos = [NSMutableArray array];
} else if ([@"video" isEqualToString:elementName]) { // 解析到一个video标签, 创建一个模型
HMVideo *video = [HMVideo videoWithDict:attributeDict];
[self.videos addObject:video];
}
} /**
* 解析到一个元素的结尾时调用 </videos>
*/
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
// NSLog(@"didEndElement----%@", elementName);
}
GDataXML配置
● 设置链接参数(自动链接libxml2库) • 在Other Linker Flags中加入-lxml2
GDataXML使用(常用方式)
● GDataXMLDocument:代表整个XML文档
● GDataXMLElement
• 代表文档中的每个元素
• 使用attributeForName:方法可以获得属性值
- (NSArray *)DOMparseXMLWithData:(NSData *)data
{
// 1.加载文档
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options: error:nil]; // 2.获得根元素
GDataXMLElement *root = doc.rootElement; // 3.获得所有video元素
NSArray *elements = [root elementsForName:@"video"]; // 4.将GDataXMLElement对象转成HMVideo模型
NSMutableArray *videos = [NSMutableArray array];
for (GDataXMLElement *ele in elements) {
HMVideo *video = [[HMVideo alloc] init];
video.ID = [ele attributeForName:@"id"].stringValue.intValue;
video.length = [ele attributeForName:@"length"].stringValue.intValue;
video.name = [ele attributeForName:@"name"].stringValue;
video.image = [ele attributeForName:@"image"].stringValue;
video.url = [ele attributeForName:@"url"].stringValue;
[videos addObject:video];
}
return videos;
}
调用XML 类
@implementation HMVideoTool - (NSArray *)parseXMLData:(NSData *)data
{
return [self DOMparseXMLWithData:data];
}
- (void)viewDidLoad
{
[super viewDidLoad]; // 去除分割线
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; [MBProgressHUD showMessage:@"正在加载视频信息...."]; // 访问服务器数据
NSString *urlStr = @"http://192.168.1.200:8080/MJServer/video?type=XML"; // 发送请求
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // GET
request.timeoutInterval = ; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 隐藏
[MBProgressHUD hideHUD]; if (data) {
// 解析数据 data : XML数据
HMVideoTool *tool = [[HMVideoTool alloc] init];
self.videos = [tool parseXMLData:data];
// 刷新表格
[self.tableView reloadData];
} else {
[MBProgressHUD showError:@"网络繁忙!!!"];
}
}];
}
IOS 解析XML数据的更多相关文章
- iOS解析XML数据
iOS中解析XML数据的类是 NSXMLParser,详细使用方法如下: 假设现在在内存中有XML的二进制数据对象(NSData):data(该数据可能来自网络,也可能是本地的文件数据),设置NSX ...
- 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!
本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/694.html ☞ ...
- IOS 解析XML文档
前段时间想找点事做,就是试着看能不能用豆瓣的API做点什么,于是就碰到了这个问题——XML解析. 老师还没讲,只能自己去查. XML文档解析主要有SAX和DOM两种模式,IOS上两种模式都可以用,这里 ...
- 解析 XML 数据
在几个月前我有做过这样的记录,其目的是避免解析 XML 时手工编写太多的代码,造成重复的体力劳动.后来经过一番资料的查找,我发现其实并没有必要做这样的工具,因为 C# 已经为我们提供了更好的解决方案了 ...
- Android网络之数据解析----SAX方式解析XML数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 160928、JQuery解析XML数据的demo
用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做.下面我们来总结几个使用JQuery解析XML的例子. 方案1 当后台返回的数据类型是xml对象 ...
- JQuery解析XML数据的几个例子
用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做.下面我们来总结几个使用JQuery解析XML的例子. 第一种方案: <script ty ...
- (四)SAX方式解析XML数据
SAX方式解析XML数据 文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程 ...
- 导入libxml.dylib用Google的GDataXML解析XML数据
1.用Google的GDataXML来解析XML数据,导入libxml.dylib 2.导入libxml.dylib的操作实现,一开始自己总是找不到libxml.dylib文件. 选择其他文件,到路径 ...
随机推荐
- etcd介绍
etcd是一个开源的.分布式的键值对数据存储系统,提供共享配置.服务的注册和发现. etcd与zookeeper相比算是轻量级系统.etcd的raft比zookeeper的paxos简单. 我们用et ...
- LBS开发
功能:用户发送自动的位置,返回周围的厕所信息 思路:根据用户的经纬度信息,调用百度地图的api,查询周围的厕所位置并且返回! 步骤:进入百度地图官网注册账号,选择web api接入 我们先看开发者文档 ...
- Vue 中怎么发起请求(一)
1.vue 支持开发者引入 jquery 使用 $.ajax() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1.首先,在 package.json 中添加 j ...
- node服务器端模块化-commomjs
modele.js getmodule.js 用exports 返回的是一个对象中的每个属性
- SQL Server覆盖索引--有无包含列对数据库查询性能的影响分析
“覆盖索引使您能够避免返回到表中以满足请求的所有列,因为所有请求的列都已经存在于非聚集索引中.这意味着您还可以避免返回到表中进行任何逻辑或物理的信息读取.” 然而,以上这不是我想要传达的全部意思,因为 ...
- android Firebase中配置 Crashlytics
首先登陆Google账号 https://firebase.google.com/ 创建项目 配置Android 1.注册应用 2.下载配置文件 3.添加firebaseSDk 配置后台分析的Cras ...
- elastic search语句
基本匹配: { "query":{ "match":{ "title" : "quick" } } } ES语法结构: ...
- vue2.X+elementUI表单自定义验证
<template> <div class="taxi-appointment-dairen"> <el-form :model="rule ...
- 3DSMAX 卸载
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- 细讲递归(recursion)
首先先对递归进行入门. 递归是以自相似的方式重复项目的过程.在编程语言中,如果程序允许您在同一函数内调用函数,则称其为函数的递归调用. 简而言之,递归就是函数的自身调用.可以看看下面的递归使用: vo ...