ios网络学习------8 xml格式数据的请求处理 用代码块封装
生活随笔
收集整理的這篇文章主要介紹了
ios网络学习------8 xml格式数据的请求处理 用代码块封装
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
#pragma mark 載入xml
- (void)loadXML
{//獲取網(wǎng)絡(luò)數(shù)據(jù)。NSLog(@"load xml");//從webserver載入數(shù)據(jù)NSString *str = @"http://www.baidu.com?format=xml"; //這里是亂寫的//1簡(jiǎn)歷NSURLNSURL *url = [NSURL URLWithString:str];//2建立NSURLRequestNSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:2.0f];//3建立NSURLConnect的同步方法載入數(shù)據(jù)NSURLResponse *response = nil;NSError *error = nil;//同步載入數(shù)據(jù)NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];MyXMLParser *myParser = [[MyXMLParser alloc]init];//懶載入實(shí)例化數(shù)據(jù)if (self.dataList == nil) {self.dataList = [NSMutableArray array];}else{[self.dataList removeAllObjects];}//解析數(shù)據(jù)[myParser xmlParserWithData:data StartName:@"video"startElement:^( NSDictionary *dict) {//1 實(shí)例化currentvideoself.currentVideo = [[Video alloc]init];//2 設(shè)置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]; //刷新表格數(shù)據(jù)} errorParser:^{NSLog(@"解析出現(xiàn)錯(cuò)誤");//清空暫時(shí)數(shù)據(jù)self.currentVideo = nil;//清空數(shù)組[self.dataList removeAllObjects];}];
}
<pre name="code" class="objc">#import <Foundation/Foundation.h>//代理方法中須要與調(diào)用者交互的方法:// 2 交互元素: elementname attributeDict// 4 交互的元素: elementname 中轉(zhuǎn)的字符串//5 僅通知就可以//6 僅通知就可以//定義塊代碼:
typedef void(^startElementBlock)(NSDictionary *dict);
typedef void(^endElementBlock)(NSString *elementName, NSString *result);
typedef void(^xmlParserNotificationBlock)();@interface MyXMLParser : NSObject
//定義解析方法
/*data xml數(shù)據(jù)startname 開始的節(jié)點(diǎn)名稱startElement 開始節(jié)點(diǎn)方法endElement 結(jié)束節(jié)點(diǎn)方法finishedparser 文檔解析結(jié)束。errorParse 文檔解析出錯(cuò)。
*/
-(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; }//開始節(jié)點(diǎn)名稱,列如:video 假設(shè)檢測(cè)到此名稱, 須要實(shí)例化對(duì)象 @property (strong, nonatomic)NSString *startElementName; //中轉(zhuǎn)字符串 @property (strong, nonatomic) NSMutableString *elementString; @end@implementation MyXMLParser//在這種方法里面實(shí)現(xiàn)xml的解析。 /*data xml數(shù)據(jù)startname 開始的節(jié)點(diǎn)名稱startElement 開始節(jié)點(diǎn)方法endElement 結(jié)束節(jié)點(diǎn)方法finishedparser 文檔解析結(jié)束。errorParse 文檔解析出錯(cuò)。*/ - (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]; //設(shè)置代理//開始解析[parser parse]; //這種方法會(huì)調(diào)用以下的幾個(gè)方法來(lái)實(shí)現(xiàn)。 }#pragma mark - XML解析器代理方法 //所謂須要與外界交互,表示須要與調(diào)用發(fā)打交道,通知調(diào)用放運(yùn)行某些操作。 //1開始解析文檔,初始化數(shù)據(jù),也不須要與外部交互。 - (void)parserDidStartDocument:(NSXMLParser *)parser {//實(shí)例化中裝字符串if (self.elementString == nil) {self.elementString = [NSMutableString string];} }//2開始解析元素(元素的頭部video, 須要實(shí)例化對(duì)象, attributedict須要設(shè)置屬性) //須要與外部交互 //交互的元素: 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);}//開始循環(huán)運(yùn)行第三個(gè)方法前,清空中轉(zhuǎn)字符串[self.elementString setString:@""]; }//3發(fā)現(xiàn)元素字符串(拼接字符串,不須要和外部交互) - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {[self.elementString appendString:string]; }//4結(jié)束元素解析,依據(jù)elementname和第三步的拼接內(nèi)容,確定對(duì)象屬性,須要與外部交互 //交互的元素: elementname 中轉(zhuǎn)的字符串 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {NSString *result = [NSString stringWithString:self.elementString];_endElementBlock(elementName, result); }//5解析文檔結(jié)束,通常須要調(diào)用放刷新數(shù)據(jù)。 //交互的元素: 僅通知就可以 - (void)parserDidEndDocument:(NSXMLParser *)parser {[self.elementString setString:@""];_finishedBlock(); } //解析出錯(cuò),通知調(diào)用方解析出錯(cuò)(須要與外界交互)。 //交互的元素: 僅通知就可以。 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {NSLog(@"解析出錯(cuò)");[self.elementString setString:@""];//帶一個(gè)nserror回去會(huì)更好。_errorBlock(); } @end
<pre name="code" class="objc">#import "MyXMLParser.h"@interface MyXMLParser() <NSXMLParserDelegate> {//記錄塊代碼的成員變量startElementBlock _startElementBlock;endElementBlock _endElementBlock;xmlParserNotificationBlock _finishedBlock;xmlParserNotificationBlock _errorBlock; }//開始節(jié)點(diǎn)名稱,列如:video 假設(shè)檢測(cè)到此名稱, 須要實(shí)例化對(duì)象 @property (strong, nonatomic)NSString *startElementName; //中轉(zhuǎn)字符串 @property (strong, nonatomic) NSMutableString *elementString; @end@implementation MyXMLParser//在這種方法里面實(shí)現(xiàn)xml的解析。 /*data xml數(shù)據(jù)startname 開始的節(jié)點(diǎn)名稱startElement 開始節(jié)點(diǎn)方法endElement 結(jié)束節(jié)點(diǎn)方法finishedparser 文檔解析結(jié)束。errorParse 文檔解析出錯(cuò)。*/ - (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]; //設(shè)置代理//開始解析[parser parse]; //這種方法會(huì)調(diào)用以下的幾個(gè)方法來(lái)實(shí)現(xiàn)。 }#pragma mark - XML解析器代理方法 //所謂須要與外界交互,表示須要與調(diào)用發(fā)打交道,通知調(diào)用放運(yùn)行某些操作。 //1開始解析文檔,初始化數(shù)據(jù),也不須要與外部交互。 - (void)parserDidStartDocument:(NSXMLParser *)parser {//實(shí)例化中裝字符串if (self.elementString == nil) {self.elementString = [NSMutableString string];} }//2開始解析元素(元素的頭部video, 須要實(shí)例化對(duì)象, attributedict須要設(shè)置屬性) //須要與外部交互 //交互的元素: 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);}//開始循環(huán)運(yùn)行第三個(gè)方法前,清空中轉(zhuǎn)字符串[self.elementString setString:@""]; }//3發(fā)現(xiàn)元素字符串(拼接字符串,不須要和外部交互) - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {[self.elementString appendString:string]; }//4結(jié)束元素解析,依據(jù)elementname和第三步的拼接內(nèi)容,確定對(duì)象屬性,須要與外部交互 //交互的元素: elementname 中轉(zhuǎn)的字符串 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {NSString *result = [NSString stringWithString:self.elementString];_endElementBlock(elementName, result); }//5解析文檔結(jié)束,通常須要調(diào)用放刷新數(shù)據(jù)。 //交互的元素: 僅通知就可以 - (void)parserDidEndDocument:(NSXMLParser *)parser {[self.elementString setString:@""];_finishedBlock(); } //解析出錯(cuò),通知調(diào)用方解析出錯(cuò)(須要與外界交互)。 //交互的元素: 僅通知就可以。 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {NSLog(@"解析出錯(cuò)");[self.elementString setString:@""];//帶一個(gè)nserror回去會(huì)更好。_errorBlock(); } @end
總結(jié)
以上是生活随笔為你收集整理的ios网络学习------8 xml格式数据的请求处理 用代码块封装的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vectorvectorint 二维容器
- 下一篇: rootvg 镜像