XML解析 适合大文件

//
//  ViewController.m
//  备课代码03-XML解析
//
//  Created by LTOVE on 15/10/18.
//  Copyright (c) 2015年 LTOVE. All rights reserved.
//

#import "ViewController.h"
#import "ViewController.h"
#import "UIImageView+WebCache.h"
#import "VideoCell.h"
#import "Video.h"

@interface ViewController () <NSXMLParserDelegate>

@property (nonatomic, strong) NSArray *dataList;

// MARK:- XML解析相关属性
@property (nonatomic, strong) NSMutableArray *videos;
@property (nonatomic, strong) Video *currentVideo;
@property (nonatomic, strong) NSMutableString *elementString;

@end

@implementation ViewController

- (void)setDataList:(NSArray *)dataList {
    _dataList = dataList;
    
    [self.tableView reloadData];
    
    [self.refreshControl endRefreshing];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.dataList.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *ID = (indexPath.row % 2) ? @"Cell2" : @"Cell";
    VideoCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    
    cell.video = self.dataList[indexPath.row];
    
    return cell;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self loadData];
}

// MARK: - 加载XML数据
- (IBAction)loadData {
    NSString *urlString = @"http://localhost/videos.xml";
    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:10.0];
    
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        
        NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
        parser.delegate = self;
        [parser parse];
    }];
}

#pragma mark - XML解析属性懒加载
- (NSMutableArray *)videos {
    if (_videos == nil) {
        _videos = [NSMutableArray array];
    }
    return _videos;
}

- (NSMutableString *)elementString {
    if (_elementString == nil) {
        _elementString = [NSMutableString string];
    }
    return _elementString;
}

#pragma mark - NSXMLParserDelegate
// 1. 开始文档
- (void)parserDidStartDocument:(NSXMLParser *)parser {
    NSLog(@"1. 开始文档");
    [self.videos removeAllObjects];
}

// 2. 开始节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    NSLog(@"2. 开始节点 %@ %@", elementName, attributeDict);
    
    if ([elementName isEqualToString:@"video"]) {
        self.currentVideo = [[Video alloc] init];
        
        self.currentVideo.videoId = attributeDict[@"videoId"];
    }
    [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(@"4. 结束节点 %@", elementName);
    
    if ([elementName isEqualToString:@"video"]) {
        [self.videos addObject:self.currentVideo];
    } else if (![elementName isEqualToString:@"videos"]) {
        [self.currentVideo setValue:self.elementString forKey:elementName];
    }
}

// 5. 结束文档
- (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@"5. 结束文档 %@ %@", self.videos, [NSThread currentThread]);
    
    dispatch_async(dispatch_get_main_queue(), ^ {self.dataList = self.videos;});
}

// 6. 解析错误
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSLog(@"6. 解析错误 %@", parseError);
}

@end

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值