#pragma mark 载入xml
- (void)loadXML
{//获取网络数据。NSLog(@"load xml");//从webserver载入数据NSString *str = @"http://www.baidu.com?format=xml";  //这里是乱写的//1简历NSURLNSURL *url = [NSURL URLWithString:str];//2建立NSURLRequestNSURLRequest *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 实例化currentvideoself.currentVideo = [[Video alloc]init];//2 设置videoidself.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 *)dataStartName:(NSString *)startNamestartElement:(startElementBlock)startElementendElement:(endElementBlock)endElementfinishedParser:(xmlParserNotificationBlock)finishedParsererrorParser:(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 *)dataStartName:(NSString *)startNamestartElement:(startElementBlock)startElementendElement:(endElementBlock)endElementfinishedParser:(xmlParserNotificationBlock)finishedParsererrorParser:(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格式数据的请求处理 用代码块封装相关推荐

  1. iOS开发之解析XML格式数据

    XML格式的数据是一种数据的传输格式.因为它方便编写.结构清晰,所以深受程序猿的喜爱,非常多人都喜欢使用XML格式数据传输或者作为程序的配置信息. 如今我将来实如今iOS中解析XML格式数据,语言使用 ...

  2. Android初级开发(九)——网络交互—解析XML格式数据

    一.前言 首先我们先搭建一个web服务器,我这里用的是tomcat,搭建过程可参见tomacat服务器的搭建:http://blog.csdn.net/qq_28585471/article/deta ...

  3. Android解析xml的方法,Android中解析XML格式数据的方法

    XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...

  4. ios网络学习------4 UIWebView的加载本地数据的三种方式

    ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...

  5. Xml 格式数据的生成和解析

    相关阅读 XML约束 Xml 格式数据的生成和解析 XML解析器 什么是XML XML全称为Extensible Markup Language, 意思是可扩展的标记语言,它是 SGML(标准通用标记 ...

  6. oracle生成xml格式化,介绍关于Oracle下存取XML格式数据的方式教程一览

    目前的程序设计和开发大多是面向对象的,所以用XML来表达数据可以让数据的处理和传播变得非常方便.为此,今天o5c小编一起与大家分享Oracle对XML格式数据的存取,由于在用XML存储数据的时候可能会 ...

  7. oracle xml文件是什么文件,介绍关于Oracle下存取XML格式数据的方式

    目前的程序设计和开发大多是面向对象的,所以用XML来表达数据可以让数据的处理和传播变得非常方便.为此,今天小编一起与大家分享Oracle对XML格式数据的存取,由于在用XML存储数据的时候可能会遇到点 ...

  8. ajax请求json和xml数据及对json和xml格式数据的解析

    ajax请求json和xml数据及对json和xml格式数据的解析 一.ajax请求json数据并解析 ajax的写法: json数据解析: 请求json经常出现的跨域报错: 二.ajax请求xml数 ...

  9. 使用PHP生成和获取XML格式数据

    生成XML格式数据 假设系统中有一张学生信息表student,需要提供给第三方调用,并有id,name,sex,age分别记录学生的姓名.性别.年龄等信息. CREATE TABLE 'student ...

最新文章

  1. cmake 版本 arm_尝试使用CMake构建Qt+Pytorch简单应用
  2. Java高并发编程(八):Java并发容器和框架
  3. -bash:XXX: command not found报错(云服务centos)
  4. 大数据 清华 覃征_2021年清华(清华大学)大数据工程考研难度解析、考研经验分享...
  5. svn: error while loading shared libraries: libsvn_client-1.so.0
  6. 移植U-BOOT之支持烧写YAFFS文件系统以及制作U-BOOT补丁
  7. lambda表达式或者匿名函数中为什么要求外部变量为final
  8. Markdown: Basics (快速入门)
  9. 怎么自学python-你们都是怎么学 Python 的?
  10. Js获取时间-天干地支空亡
  11. java equal_Java equal() 和 == 详细分析
  12. gulp-tinypng-nokey [error]: xxx Too many files uploaded at once
  13. Python GIS神器shapely 2.0新版本来了
  14. 三维重建基本流程,搭建一个龙的demo
  15. 如何定位web前后台的BUG
  16. 腾讯万字Code Review规范出炉!别再乱写代码了
  17. 【转】RMAN-06094: datafile 1 must be restored ID 1339439.1
  18. 了解第二部分多武装匪徒的强化学习手
  19. php必须是汉字的 正则,php汉字正则表达式
  20. 微信小程序实现登录获取头像昵称

热门文章

  1. python知识:几个排序算法的python实现
  2. 小能量汇聚成大能量_清体能量棒配料解析:小种子,大能量,藜麦和青稞
  3. ios 添加浮动效果_iOS实现拖拽View跟随手指浮动效果
  4. 2021-05-08 docker  拷贝东西到镜像,和拷贝到宿主机
  5. 2020-12-09 深度学习 卷积神经网络结构分析
  6. .bak 服务器备份文件,如何从SQL Server Management Studio中的多个备份(bak)文件还原数据库...
  7. java对象是 什么的集合_java持有对象-集合类
  8. java if and_关于java:if语句中可以有两个条件吗
  9. 计算机的优势和劣势_100亿倍,中国量子计算机完胜美国,向中方科学家致敬
  10. 初二计算机辅导记录,(初中信息技术兴趣小组活动记录.doc