iosネットワーク学習------8 xmlフォーマットデータの要求処理用コードブロックパッケージ

6971 ワード

#pragma mark   xml
- (void)loadXML
{
    //      。
    NSLog(@"load xml");
    // webserver    
    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];
    MyXMLParser *myParser = [[MyXMLParser alloc]init];
    
    //        
    if (self.dataList == nil) {
        self.dataList = [NSMutableArray array];
    }else{
        [self.dataList removeAllObjects];
    }
    
    //    
    [myParser xmlParserWithData:data StartName:@"video"
    startElement:^( NSDictionary *dict) {
        //1    currentvideo
        self.currentVideo = [[Video alloc]init];
        //2   videoid
        self.currentVideo.videoId = [dict[@"videoId"]integerValue];
    } endElement:^(NSString *elementName, NSString *result) {
        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];
        }
    } finishedParser:^{
        self.currentVideo = nil;
        [self.tableView reloadData];   //      
    } errorParser:^{
        NSLog(@"      ");
        //      
        self.currentVideo = nil;
        //    
        [self.dataList removeAllObjects];
    }];
}




<pre name="code" class="objc">#import <Foundation/Foundation.h>

//                :
 // 2     : elementname  attributeDict
 // 4      : elementname       
  //5       
  //6       

//     :
typedef void(^startElementBlock)(NSDictionary *dict);
typedef void(^endElementBlock)(NSString *elementName, NSString *result);
typedef void(^xmlParserNotificationBlock)();

@interface MyXMLParser : NSObject
//      
/*
 data  xml  
 startname        
 startElement       
 endElement        
 finishedparser       。
 errorParse        。
*/
-(void)xmlParserWithData:(NSData *)data
                 StartName:(NSString *)startName
                 startElement:(startElementBlock)startElement
                 endElement:(endElementBlock)endElement
                 finishedParser:(xmlParserNotificationBlock)finishedParser
                 errorParser:(xmlParserNotificationBlock)errorParser;
@end
 
   


<pre name="code" class="objc">#import "MyXMLParser.h"

@interface MyXMLParser() <NSXMLParserDelegate>
{
    //          
    startElementBlock _startElementBlock;
    endElementBlock _endElementBlock;
    xmlParserNotificationBlock _finishedBlock;
    xmlParserNotificationBlock _errorBlock;
}

//      ,  :video          ,        
@property (strong, nonatomic)NSString *startElementName;
//     
@property (strong, nonatomic) NSMutableString *elementString;
@end


@implementation MyXMLParser

//         xml   。
/*
 data  xml  
 startname        
 startElement       
 endElement        
 finishedparser       。
 errorParse        。
 */
- (void)xmlParserWithData:(NSData *)data
                    StartName:(NSString *)startName
                    startElement:(startElementBlock)startElement
                    endElement:(endElementBlock)endElement
                    finishedParser:(xmlParserNotificationBlock)finishedParser
                    errorParser:(xmlParserNotificationBlock)errorParser
{
    self.startElementName = startName;
    //     
    _startElementBlock = startElement;
    _endElementBlock = endElement;
    _finishedBlock = finishedParser;
    _errorBlock = errorParser;
    
    //           
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
    [parser setDelegate:self]; //    
    //    
    [parser parse]; //                 。
}


#pragma mark - XML       
//         ,           ,           。
//1      ,     ,         。
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    //        
    if (self.elementString == nil) {
        self.elementString = [NSMutableString string];
    }
}

//2      (     video,        , attributedict      )
//       
//     : elementName  attributeDict
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:self.startElementName]) {
        //      
        _startElementBlock(attributeDict);
    }
    //            ,       
    [self.elementString setString:@""];
}

//3       (     ,        )
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    [self.elementString appendString:string];
}

//4      ,  elementname         ,      ,       
//     : elementname        
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSString *result = [NSString stringWithString:self.elementString];
    _endElementBlock(elementName, result);
}

//5      ,           。
//     :       
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    [self.elementString setString:@""];
    _finishedBlock();
}
//    ,         (       )。
//     :       。
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    NSLog(@"    ");
    [self.elementString setString:@""];
    //   nserror     。
    _errorBlock();
}
@end