日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2025/3/21 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ios网络学习------8 xml格式数据的请求处理 用代码块封装 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#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格式数据的请求处理 用代码块封装的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。