IOS--XML解析

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-

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值