sax方法进行xml解析
来源:互联网 发布:剑桥中国史知乎 编辑:程序博客网 时间:2024/05/16 05:25
在进行XML解析的时候有很多方法 当xml文件特别大的时候我们要使用以下方法,这个方法是一个节点一个节点的往出分析。是sax。
#import "ViewController.h"#import "Video.h"@interface ViewController ()<NSXMLParserDelegate>/**整个xml的数据容器*/@property(nonatomic,strong)NSMutableArray *videos;/**第3步拼接字符串*/@property(nonatomic,strong)NSMutableString *elementString;/**当前的模型*/@property(nonatomic,strong) Video *currentVideo;/**表格的所有数据*/@property (nonatomic, strong) NSMutableArray *dataList;@end@implementation ViewController- (void)setDataList:(NSMutableArray *)dataList{ _dataList = dataList; // 只要重新给表格的数据容器赋值,就刷新 [self.tableView reloadData]; // 隐藏刷新控件 [self.refreshControl endRefreshing];}- (NSMutableArray *)videos{ if (_videos == nil) { _videos = [NSMutableArray array]; } return _videos;}- (NSMutableString *)elementString{ if (_elementString == nil) { _elementString = [NSMutableString string]; } return _elementString;}- (void)viewDidLoad { [super viewDidLoad]; [self loadData];}#pragma mark - 加载数据- (IBAction)loadData{ // 1. url NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/videos.xml"]; // 2. 请求 NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:2.0f]; // 3. 连接 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { // xml的解析 // 1. 实例化一个xml的解析器--通过代理来实现xml的解析 NSXMLParser *parse = [[NSXMLParser alloc] initWithData:data]; // 2. 设置代理 parse.delegate = self; // 3. 解析器开始解析 [parse parse]; }];}#pragma mark - 代理方法//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); // 如果开始节点的名称 是video,就创建一个对象 if ([elementName isEqualToString:@"video"]) { self.currentVideo = [[Video alloc] init]; // 设置videoID self.currentVideo.videoId = attributeDict[@"videoId"]; } // 清空字符串的内容,因为马上要进入第3 个方法,要开始拼接当前的节点的内容 [self.elementString setString:@""];}//3. 发现节点里面内容- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ NSLog(@"3. 发现节点里面内容--->%@", 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"]) { // 如果结束的节点是video, 需要把这个对象添加到数组 [self.videos addObject:self.currentVideo]; }else if (![elementName isEqualToString:@"videos"]){ [self.currentVideo setValue:self.elementString forKeyPath:elementName]; } // else if ([elementName isEqualToString:@"name"]) {// 如果结束节点,就可以把第二步创建的对象,设置name/length属性// // 设置name属性// // 1. 直接赋值//// self.currentVideo.name = self.elementString;// // 2. KVC赋值//// [self.currentVideo setValue:self.elementString forKeyPath:@"name"];// // 3. 改造// [self.currentVideo setValue:self.elementString forKeyPath:elementName];// }else if ([elementName isEqualToString:@"length"]){// // 设置length属性//// self.currentVideo.length = @([self.elementString integerValue]);// // [self.currentVideo setValue:self.elementString forKeyPath:elementName];// }else if ([elementName isEqualToString:@"videoURL"]){// // 设置videoURL属性//// self.currentVideo.videoURL = self.elementString;// [self.currentVideo setValue:self.elementString forKeyPath:elementName];// }else if ([elementName isEqualToString:@"desc"]){// // 设置desc属性//// self.currentVideo.desc = self.elementString;// [self.currentVideo setValue:self.elementString forKeyPath:elementName];// }else if ([elementName isEqualToString:@"teacher"]){// // 设置teacher属性//// self.currentVideo.teacher = self.elementString;// [self.currentVideo setValue:self.elementString forKeyPath:elementName];// } // cocoa 的大招 KVC}//5 结束文档- (void)parserDidEndDocument:(NSXMLParser *)parser{ NSLog(@"5 结束文档"); // xml真正解析结束, 可以更新UI, 在主线程 dispatch_async(dispatch_get_main_queue(), ^{ self.dataList = self.videos; }); }#pragma tabel数据源方法- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return self.videos.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; Video *video = self.dataList[indexPath.row]; cell.textLabel.text = video.name; return cell;}@end
上方的video的对象的model如下:
#import <Foundation/Foundation.h>@interface Video : NSObject@property (nonatomic, copy) NSNumber *videoId;@property (nonatomic, copy) NSString *name;@property (nonatomic, copy) NSNumber *length;@property (nonatomic, copy) NSString *videoURL;@property (nonatomic, copy) NSString *imageURL;@property (nonatomic, copy) NSString *desc;@property (nonatomic, copy) NSString *teacher;@property (nonatomic, readonly) NSString *time;- (instancetype)initWithDict:(NSDictionary *)dict;+ (instancetype)videoWithDict:(NSDictionary *)dict;@end
#import "Video.h"@implementation Video- (instancetype)initWithDict:(NSDictionary *)dict { self = [super init]; if (self) { [self setValuesForKeysWithDictionary:dict]; } return self;}+ (instancetype)videoWithDict:(NSDictionary *)dict { return [[self alloc] initWithDict:dict];}- (NSString *)time { int len = self.length.intValue; return [NSString stringWithFormat:@"%02d:%02d:%02d", len / 3600, (len % 3600) / 60, (len % 60)];}- (NSString *)description { return [NSString stringWithFormat:@"<%@ : %p> { videoId : %@, name : %@, length : %@, videoURL : %@, imageURL : %@, desc : %@, teacher : %@}", [self class], self, self.videoId, self.name, self.length, self.videoURL, self.imageURL, self.desc, self.teacher];}@end下方是我们要解析的文件的图片,作为参考:
4 0
- sax方法进行xml解析
- SAX方式进行XML解析
- SAX中止解析XML方法
- XML文件解析---SAX方法
- SAX方法解析XML文件
- SAX进行实体解析XML(android)
- SAX进行实体解析XML(android)
- 使用SAX方式对XML进行解析
- IOS XML解析解析方法SAX
- 【XML解析】使用Dom4j对XML进行SAX解析
- Java 解析xml的方法:DOM,SAX
- SAX方式解析XML的简单方法
- Android解析xml文件的方法:SAX
- 通过SAX方法解析xml文件
- XML解析方法SAX (Java)
- Java对XML文档进行解析(SAX、StAX解析)
- [XML] SAX解析XML
- 【XML】SAX解析XML
- Java实现超市管理系统Class思维模式实现,空指针问题常见处理办法
- 各种数据库(MYSQL、Oracle、DB2、SQL Server、PostgreSQL)的分页查询语句
- 144. Binary Tree Preorder Traversal
- Xcode江湖录-第02章 纵观全局——布局探索
- Invalid property 'maxActive' of bean class [redis.clients.jedis.JedisPoolConfig]
- sax方法进行xml解析
- 方法的重载
- js跨域问题浅析及解决方法优缺点对比
- 地理配准工具条为灰色的原因
- 快速多人游戏(2) - 客户端预测和服务器校验
- warning: format ‘%s’ expects argument of type ‘char *’和warning: backslash and newline separated by
- 学习SpringMVC(二十四)之异常处理
- 如何让服务器支持跨域
- service