用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];}