你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> ios網絡學習------7 xml格式數據的請求處理

ios網絡學習------7 xml格式數據的請求處理

編輯:IOS開發綜合

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


  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved