xml解析
简单介绍
xml也叫做”可扩展标记语言”
在IOS中,它跟JSON一样,,是常用的一种用于交互的数据格式
一般也叫xml文档
- 常见的xml文档一般由:文档声明,元素(Element),属性(Attribute)组成
- xml解析方式分为两种:
- SAX:一次性加载所有xml进内存,适合小文档
- DOM:从根元素开始,一个一个元素解析,适合大文档
- 苹果原生的解析手段:NSXMLParser,SAX方式解析,使用简单
- 这货主要是通过代理来干事情
解析步骤
- 1.创建解析器
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
- 2.设置代理
parser.delegate = self;
- 3.开始解析
[parser parse];
- 4.开始解析文档的时候调用
- (void)parserDidStartDocument:(NSXMLParser *)parser{...}
- 5.解析每一个元素的时候调用
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
...
}
6.解析完一个元素调一次
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
...
}
7.解析完所有(指的是文档)的时候调用
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
...//一般在这更新数据(reloadData)
}
8.解析出现错误的时候调用
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
...
}
- PS:我都被自己坑怕了,懒加载的时候忘记写了一个感叹号(!)
部分源代码
//模型类
//LGVideo.h
#import <Foundation/Foundation.h>
@interface LGVideo : NSObject
/** id */
@property (nonatomic, copy) NSString *ID;
/** image */
@property (nonatomic, copy) NSString *image;
/** length */
@property (nonatomic, copy) NSString *length;
/** name */
@property (nonatomic, copy) NSString *name;
/** url */
@property (nonatomic, copy) NSString *url;
+ (instancetype)videoWithDict:(NSDictionary *)dict;
- (instancetype)initWithDict:(NSDictionary *)dict;
@end
/**********************************/
//LGVideo.m
#import "LGVideo.h"
@implementation LGVideo
+ (instancetype)videoWithDict:(NSDictionary *)dict
{
return [[self alloc] initWithDict:dict];
}
- (instancetype)initWithDict:(NSDictionary *)dict
{
if (self = [super init]) {
//[self setValuesForKeysWithDictionary:dict];
self.image = dict[@"image"];
self.name = dict[@"name"];
self.length = dict[@"length"];
self.url = dict[@"url"];
self.ID = dict[@"id"];
}
return self;
}
@end
- 核心代码
#import "ViewController.h"
#import "LGVideo.h"
#import <SDWebImage/UIImageView+WebCache.h>
#import <MediaPlayer/MediaPlayer.h>
#import <MJExtension/MJExtension.h>
@interface ViewController ()<NSXMLParserDelegate>
@property (nonatomic, strong) NSMutableArray *videos;
@end
@implementation ViewController
- (NSMutableArray *)videos
{
if (!_videos) {
_videos = [NSMutableArray array];
}
return _videos;
}
- (void)viewDidLoad {
[super viewDidLoad];
//请求数据
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
//创建xml解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
//设置代理
parser.delegate = self;
//开始解析
[parser parse];
}];
}
#pragma mark - 数据源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.videos.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"000000000000");
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
//设置数据
LGVideo *video = self.videos[indexPath.row];
cell.detailTextLabel.text = [NSString stringWithFormat:@"时长:%@",video.length];
cell.textLabel.text = video.name;
NSString *urlString = [@"http://120.25.226.186:32812" stringByAppendingPathComponent:video.image];
NSLog(@"%@",video.image);
NSURL *url = [NSURL URLWithString:urlString];
[cell.imageView sd_setImageWithURL:url placeholderImage:nil];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
LGVideo *video = self.videos[indexPath.row];
NSString *urlString = [@"http://120.25.226.186:32812" stringByAppendingPathComponent:video.url];
NSURL *url = [NSURL URLWithString:urlString];
MPMoviePlayerViewController *moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
[self presentViewController:moviePlayer animated:YES completion:nil];
}
#pragma mark - 解析xml用的代理
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"videos"]) {
return;
} //
LGVideo *video = [LGVideo objectWithKeyValues:attributeDict];
[self.videos addObject:video];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
//NSLog(@"didEndElement:");
}
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
// NSLog(@"parserDidEndDocument:");
[self.tableView reloadData];
}
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
// NSLog(@"parserDidStartDocument:");
}
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
//NSLog(@"parseErrorOccurred:");
}
@end
代码仓库地址:
https://github.com/LGLee/XML-