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