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 ...
随机推荐
- xunsearch安装与卸载
刚接触xunsearch(迅搜)的时候,我是排斥的.排斥的原因不是因为害怕学习新技术(其实我是对心技术很感兴趣),而是因为:一方面xunsearch是国人开发的,对于国人写的开源产品,我不是太感兴趣( ...
- 30款javascript脚本插件 jquery插件大全
Shifty Nav - a Fully Responsive JS CSS3 Mega Menu Show Demo Shifty Nav is a fully responsive CSS3 ...
- 转:CSS3 Flexbox 布局介绍
转:CSS3 Flexbox 布局介绍 Flexbox是一个用于页面布局的全新CSS3模块功能.它可以把列表放在同一个方向(从左到右或从上到下排列),并且让这些列表能延伸到占用可用的空间.较为复杂的布 ...
- Adobe Acrobat XI Pro 官方下载及安装破解
Adobe公司推出的PDF 格式是一种全新的电子文档格式.借助 Acrobat ,您几乎可以用便携式文档格式 (Portable Document Format ,简称 PDF) 出版所有的文档. P ...
- spring mvc 使用jsr-303进行表单验证的方法介绍
源代码来源:http://howtodoinjava.com/spring/spring-mvc/spring-bean-validation-example-with-jsr-303-annotat ...
- openNebula rgister img instance vms error collections
1, 注册镜像报错信息 ERROR="Fri Nov 21 12:57:17 2014 : Error copying image in the datastore: Not allowed ...
- cloud computing platform,virtual authentication encryption
Distributed Management Task Forcevirtual Ethernet port aggregator encryption,authenticating,local ac ...
- ntpd和ntpdate的区别
之前配置ntpd的时候搜到一句话,印象很深刻,也觉得很有标题党的效果,就借鉴为标题了:“我认为有几种人是必须不招聘/裁掉的: 1 用ntpdate代替ntpd的人”但具体原因不太懂,总觉得还是用ntp ...
- spring bean之间的关系:继承;依赖
概要: ' 继承Bean配置 Spring同意继承bean的配置,被继承的bean称为父bean,继承这个父Bean的Bean称为子Bean 子Bean从父Bean中继承配置,包含Bean的属性配置 ...
- mysql关联更新
update tb_sdd_info a,tb_bnm_evian_info b set a.username=b.username where a.username=b.memberno and ...