ios网络学习------8 xml格式数据的请求处理 用代码块封装
#pragma mark 载入xml
- (void)loadXML
{
//获取网络数据。
NSLog(@"load xml");
//从webserver载入数据
NSString *str = @"http://www.baidu.com?format=xml"; //这里是乱写的
//1简历NSURL
NSURL *url = [NSURL URLWithString:str];
//2建立NSURLRequest
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:2.0f];
//3建立NSURLConnect的同步方法载入数据
NSURLResponse *response = nil;
NSError *error = nil; //同步载入数据
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
MyXMLParser *myParser = [[MyXMLParser alloc]init]; //懒载入实例化数据
if (self.dataList == nil) {
self.dataList = [NSMutableArray array];
}else{
[self.dataList removeAllObjects];
} //解析数据
[myParser xmlParserWithData:data StartName:@"video"
startElement:^( NSDictionary *dict) {
//1 实例化currentvideo
self.currentVideo = [[Video alloc]init];
//2 设置videoid
self.currentVideo.videoId = [dict[@"videoId"]integerValue];
} endElement:^(NSString *elementName, NSString *result) {
if ([elementName isEqualToString:@"name"]) {
self.currentVideo.name = result;
}else if ([elementName isEqualToString:@"length"]){
self.currentVideo.length = [result integerValue];
}else if ([elementName isEqualToString:@"videoURL"]){
self.currentVideo.videoId = [result integerValue];
}else if ([elementName isEqualToString:@"imageURL"]){
self.currentVideo.imageURL = result;
}else if ([elementName isEqualToString:@"desc"]){
self.currentVideo.desc = result;
}else if ([elementName isEqualToString:@"teacher"]){
self.currentVideo.teacher = result;
}else if ([elementName isEqualToString:@"video"]){
[self.dataList addObject:self.currentVideo];
}
} finishedParser:^{
self.currentVideo = nil;
[self.tableView reloadData]; //刷新表格数据
} errorParser:^{
NSLog(@"解析出现错误");
//清空暂时数据
self.currentVideo = nil;
//清空数组
[self.dataList removeAllObjects];
}];
}
<pre name="code" class="objc">#import <Foundation/Foundation.h> //代理方法中须要与调用者交互的方法:
// 2 交互元素: elementname attributeDict
// 4 交互的元素: elementname 中转的字符串
//5 仅通知就可以
//6 仅通知就可以 //定义块代码:
typedef void(^startElementBlock)(NSDictionary *dict);
typedef void(^endElementBlock)(NSString *elementName, NSString *result);
typedef void(^xmlParserNotificationBlock)(); @interface MyXMLParser : NSObject
//定义解析方法
/*
data xml数据
startname 開始的节点名称
startElement 開始节点方法
endElement 结束节点方法
finishedparser 文档解析结束。
errorParse 文档解析出错。
*/
-(void)xmlParserWithData:(NSData *)data
StartName:(NSString *)startName
startElement:(startElementBlock)startElement
endElement:(endElementBlock)endElement
finishedParser:(xmlParserNotificationBlock)finishedParser
errorParser:(xmlParserNotificationBlock)errorParser;
@end
<pre name="code" class="objc">#import "MyXMLParser.h" @interface MyXMLParser() <NSXMLParserDelegate>
{
//记录块代码的成员变量
startElementBlock _startElementBlock;
endElementBlock _endElementBlock;
xmlParserNotificationBlock _finishedBlock;
xmlParserNotificationBlock _errorBlock;
} //開始节点名称,列如:video 假设检測到此名称, 须要实例化对象
@property (strong, nonatomic)NSString *startElementName;
//中转字符串
@property (strong, nonatomic) NSMutableString *elementString;
@end @implementation MyXMLParser //在这种方法里面实现xml的解析。
/*
data xml数据
startname 開始的节点名称
startElement 開始节点方法
endElement 结束节点方法
finishedparser 文档解析结束。
errorParse 文档解析出错。
*/
- (void)xmlParserWithData:(NSData *)data
StartName:(NSString *)startName
startElement:(startElementBlock)startElement
endElement:(endElementBlock)endElement
finishedParser:(xmlParserNotificationBlock)finishedParser
errorParser:(xmlParserNotificationBlock)errorParser
{
self.startElementName = startName;
//记录块代码
_startElementBlock = startElement;
_endElementBlock = endElement;
_finishedBlock = finishedParser;
_errorBlock = errorParser; //定义解析器而且開始解析
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
[parser setDelegate:self]; //设置代理
//開始解析
[parser parse]; //这种方法会调用以下的几个方法来实现。
} #pragma mark - XML解析器代理方法
//所谓须要与外界交互,表示须要与调用发打交道,通知调用放运行某些操作。
//1開始解析文档,初始化数据,也不须要与外部交互。
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
//实例化中装字符串
if (self.elementString == nil) {
self.elementString = [NSMutableString string];
}
} //2開始解析元素(元素的头部video, 须要实例化对象, attributedict须要设置属性)
//须要与外部交互
//交互的元素: elementName attributeDict
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:self.startElementName]) {
//開始部分代码
_startElementBlock(attributeDict);
}
//開始循环运行第三个方法前,清空中转字符串
[self.elementString setString:@""];
} //3发现元素字符串(拼接字符串,不须要和外部交互)
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
[self.elementString appendString:string];
} //4结束元素解析,依据elementname和第三步的拼接内容,确定对象属性,须要与外部交互
//交互的元素: elementname 中转的字符串
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSString *result = [NSString stringWithString:self.elementString];
_endElementBlock(elementName, result);
} //5解析文档结束,通常须要调用放刷新数据。
//交互的元素: 仅通知就可以
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
[self.elementString setString:@""];
_finishedBlock();
}
//解析出错,通知调用方解析出错(须要与外界交互)。
//交互的元素: 仅通知就可以。
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
NSLog(@"解析出错");
[self.elementString setString:@""];
//带一个nserror回去会更好。
_errorBlock();
}
@end
ios网络学习------8 xml格式数据的请求处理 用代码块封装的更多相关文章
- ios网络学习------6 json格式数据的请求处理
ios网络学习------6 json格式数据的请求处理 分类: IOS2014-06-30 20:33 471人阅读 评论(3) 收藏 举报 #import "MainViewContro ...
- iOS开发之解析XML格式数据
XML格式的数据是一种数据的传输格式.因为它方便编写.结构清晰,所以深受程序猿的喜爱,非常多人都喜欢使用XML格式数据传输或者作为程序的配置信息. 如今我将来实如今iOS中解析XML格式数据,语言使用 ...
- ios网络学习------4 UIWebView的加载本地数据的三种方式
ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...
- 解析XML格式数据
学习解析XML格式的数据前,搭建一个简单的web服务器,在这个服务器上提供xml文本用于练习. 一.搭建Apache服务器 在Apache官网下载编译好的服务器程序,安装.对于Windows来说127 ...
- R语言XML格式数据导入与处理
数据解析 XML是一种可扩展标记语言,它被设计用来传输和存储数据.XML是各种应用程序之间进行数据传输的最常用的工具.它与Access,Oracle和SQL Server等数据库不同,数据库提供了更强 ...
- yii2 输出xml格式数据
作者:白狼 出处:http://www.manks.top/yii2_xml_response.html.html本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文 ...
- Android使用DOM生成和输出XML格式数据
Android使用DOM生成和输出XML格式数据 本文主要简单解说怎样使用DOM生成和输出XML数据. 1. 生成和输出XML数据 代码及凝视例如以下: try { DocumentBuilderFa ...
- Android中解析XML格式数据的方法
XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...
- Controller接收处理json、xml格式数据
1.RequestBody接收json格式的数据,并直接转为对象. User.java使用lombok依赖包 @Data @AllArgsConstructor @NoArgsConstructor ...
随机推荐
- SQL Server FileStream优点与不足
LOB优点: 1.保证大对象的事务一致性. 2.备份与还原包括大数据对象,可以对它进行时点恢复. 3.所有数据都可以使用一种存储与查询环境. LOB不足: 1.大型对象在缓存中占非常大的缓存区. 2. ...
- 使用MySQL处理百万级以上数据时,不得不知道的几个常识
最近一段时间参与的项目要操作百万级数据量的数据,普通SQL查询效率呈直线下降,而且如果where中的查询条件较多时,其查询速度简直无法容忍.之前数据量小的时候,查询语句的好坏不会对执行时间有什么明显的 ...
- [Leetcode][Python][DP]Regular Expression Matching
# -*- coding: utf8 -*-'''https://oj.leetcode.com/problems/regular-expression-matching/ Implement reg ...
- uva 10003 Cutting Sticks (区间dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: 打开 题目大意 一根长为l的木棍,上面有n个"切点",每个点的位置为c[i] 要按照一 ...
- C与C++不同
常量表示方法不同 C不支持引用,C++支持 注释不同,C89不支持单行注释 (++i)++在C中不合法 (a=3)=4在C中不合法 不能在for循环头部定义变量 C++注重类型,强类型,严格检查类型 ...
- 07.19 Linux命令 cd
情景:在用compass编写sass,cd进入目录后,想退出, 解决: cd.. 回到上一层目录 cd\ 回到根目录 cd 进入具体目录
- log file sync等待超高一例
这是3月份某客户的情况,原因是server硬件故障后进行更换之后,业务翻译偶尔出现提交缓慢的情况.我们先来看下awr的情况. 我们能够看到,该系统的load profile信息事实上并不高,每秒才21 ...
- 假设写一个android桌面滑动切换屏幕的控件(一)
首先这个控件应该是继承ViewGroup: 初始化: public class MyGroup extends ViewGroup{ private Scroller mScroller; priva ...
- Ceph对象存储网关中的索引工作原理<转>
Ceph 对象存储网关允许你通过 Swift 及 S3 API 访问 Ceph .它将这些 API 请求转化为 librados 请求.Librados 是一个非常出色的对象存储(库)但是它无法高效的 ...
- BZOJ 2594: [Wc2006]水管局长数据加强版( LCT )
离线然后就是维护加边的动态MST, Link cut tree秒掉..不过我写+调了好久...时间复杂度O(NlogN + MlogM) ------------------------------- ...