您的位置:首页 > 其它

XML解析 适合大文件

2015-10-18 21:42 381 查看
//
//  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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: