ios网络学习------8 xml格式数据的请求处理 用代码块封装

#pragma mark 加载xml
- (void)loadXML
{
    //获取网络数据。
    NSLog(@"load xml");
    //从web服务器加载数据
    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格式数据的请求处理 用代码块封装,布布扣,bubuko.com

时间: 2024-11-08 13:53:25

ios网络学习------8 xml格式数据的请求处理 用代码块封装的相关文章

ios网络学习------7 xml格式数据的请求处理

用NSXMLParser解析XML文件过程: 1 创建NSXMLParser实例,并传入从服务器接收XML数据. 2 定义解析器代理 3 解析器解析. 4 通过解析代理方法完成XML数据的解析. #pragma mark 加载xml - (void)loadXML { //获取网络数据. NSLog(@"load xml"); //从web服务器加载数据 NSString *str = @"http://www.baidu.com?format=xml"; //这里

ios网络学习------5 json格式数据的请求处理

JSON正逐步取代XML,成为网络数据的通用格式. 从ios5开始,使用NSJSONSerialization对JSON解析.还有第三方库,比如SBJson, JSONKit, TouchJson等.从性能上说,NSJSONSerizlization最好,JSONKit其次,SBJson使用较为广泛. 加载json文件: #pragma mark 加载json - (void)loadJson { NSLog(@"load json"); //从web服务器加载数据 NSString

ios网络学习------6 json格式数据的请求处理

#import "MainViewController.h" #import "Video.h" #define kBaseURL @"http://192.168.3.252/~apple" @interface MainViewController ()<UITableViewDataSource, UITableViewDelegate> @property (strong, nonatomic) NSArray *dataLi

iOS开发之解析XML格式数据

XML格式的数据是一种数据的传输格式.因为它方便编写.结构清晰,所以深受程序猿的喜爱,非常多人都喜欢使用XML格式数据传输或者作为程序的配置信息. 如今我将来实如今iOS中解析XML格式数据,语言使用Swift. 首先自己写一个简单的XML: <data> <person age="15">zhangsan</person> <person age="2">lisi</person> <person&

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

UIWebView是IOS内置的浏览器,可以浏览网页,打开文档  html/htm  pdf   docx  txt等格式的文件.  safari浏览器就是通过UIWebView做的. 服务器将MIME的标识符等放入传送的数据中告诉浏览器使用那种插件读取相关文件. uiwebview加载各种本地文件(通过loadData方法): - (void)viewDidLoad { [super viewDidLoad]; [self setupUI]; NSString *path = [[NSBund

iOS dom解析xml格式数据

问题描述:接口返回的是xml格式数据,而且节点名居然都是相同的,采用了dom解析最终解决 一.文件导入 1.下载GDataXMLNode.h 和 GDataXMLNode.m文件,导入工程(csdn文件下载链接:http://download.csdn.net/detail/wusangtongxue/9502292) 2.配置环境: (1)改成ARC环境(-fno-objc-arc): (2)找到“Paths\Header Search Paths”项,并添加“/usr/include/lib

ios网络学习------1get post异步请求

网络请求的步骤: get请求: #pragma mark - 这是私有方法,尽量不要再方法中直接使用属性,因为一般来说属性都是和界面关联的,我们可以通过参数的方式来使用属性 #pragma mark Get登录方法 - (void)loginWithGet:(NSString *)name pwd:(NSString *)pwd { //1确定地址NSURL NSString *urlString = [NSString stringWithFormat:@"www.baidu.com?user

ios网络学习------11 原生API文件上传之断点续传思路

#import "MainViewController.h" @interface MainViewController () @end @implementation MainViewController - (void)viewDidLoad { [super viewDidLoad]; //下载文件 [self download]; } -(void)download { //1. NSURL NSURL *url = [NSURL URLWithString:@"ht

Android之解析XML格式数据

作用:在网络上传输数据时最常用的格式有两种,XML 和 JSON.解析XML格式数据获得与后台交互的信息. 种类: 3种:Pull 解析方式:SAX 解析方式:DOM解析方式. 1.使用Pull解析器解析XML文档Pull解析器的运行方式和SAX解析器很相似,它提供了类似的事件,比如文档开始.文档结束.开始元素和结束元素等.使用parser.next()方法可以进入下一个元素并触发相应的事件.各种事件均已数字的形式被发送,因此可以在程序中使用一个switch语句来对事件进行选择,然后进行相应的事