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