ios網路學習------7 xml格式資料的請求處理

來源:互聯網
上載者:User

用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";  //這裡是亂寫的    //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];       //1執行個體化解析器,傳入要解析的資料    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];    //2 設定代理    [parser setDelegate:self];    //3解析器解析,這個方法會調用代理裡面的方法。    [parser parse];}/* xml解析思路;  0 資料初始化工作,執行個體化dataList和第三步需要使用的全域字串。  1 如果在第二個方法中,elementName  == video .會在attributeDict中包含videoId  2 如果在第二個方法中, elementName == video。。需要執行個體化一個全域的video屬性,記錄2 3 4步驟中解析當前視頻資訊對象  3 其它的屬性會依次執行2 ,3 ,4 方法,同時在第三個方法中可能多次被調用。  4 在第三個方法中,需要拼接字串  需要定義一個全域的屬性記錄中間過程  5 在第四個方法中,可以通過第三個方法拼接出的字串獲得elementName對應的內容。    可以設定全域video對象的elementName對應的數值。  6 在第四個方法中,如果elementName  == video,則將該方法插入datalist中。  需要的準備工作:  1 全域的字串,記錄每一個元素的完整內容。  2 全域的video對象,記錄當前正在解析的元素。 */#pragma mark - XML解析器代理方法//1 解析文檔- (void)parserDidStartDocument:(NSXMLParser *)parser{    NSLog(@"開始解析");    //懶載入執行個體化資料    if (self.dataList == nil) {        self.dataList = [NSMutableArray array];    }else{        [self.dataList removeAllObjects];    }        //中間字串    if(self.elementString == nil)    {        self.elementString = [NSMutableString string];    }else{        //self.elementString = @"";        [self.elementString setString:@""];    }}//在整個XML檔案解析完成之前, 2,3,4會被重複調用//2開始解析一個元素,新的節點開始了。- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{    NSLog(@"開始解析元素 %@ %@", elementName, attributeDict);    if ([elementName isEqualToString:@"video"]) {        //1 執行個體化currentvideo        self.currentVideo = [[Video alloc]init];        //2 儲存videoid        self.currentVideo.videoId = [attributeDict[@"videoId"]integerValue];    }    //需要清空中轉字串    [self.elementString setString:@""];}//3接收元素的資料(發現字元,這個方法會因為元素內容過大,此方法會被重複調用,需要拼接資料)- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{    NSLog(@"發現字元 %@", string);    [self.elementString appendString:string];}//4結束解析一個元素- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{    NSLog(@"完成解析元素 %@", elementName);    //獲得第三步拼接出來的字串。    NSString *result = [NSString stringWithString:self.elementString];    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];    }}//5解析文檔結束- (void)parserDidEndDocument:(NSXMLParser *)parser{    NSLog(@"文檔結束 %@", self.dataList);    //清空臨時資料    self.currentVideo = nil;    [self.elementString setString:@""];        //uitableview重新整理資料    [self.tableView reloadData];}//6解析出錯- (void)parser:(NSXMLParser *)parser validationErrorOccurred:(NSError *)validationError{    NSLog(@"解析出現錯誤");    //清空臨時資料    self.currentVideo = nil;    [self.elementString setString:@""];    //清空臨時數組    [self.dataList removeAllObjects];}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.