iOS:XML文件的解析(SAX解析)

XML解析分为DOM解析和SAX解析,DOM解析非常的耗费性能,所以移动设备一般用SAX解析.它是从上向下解析的.

下面是我们要解析的XML文件样式.


先创建一个模型,名字就叫MCVideo,我们的最终目的就是将XML文件解析成模型数组.

#import <Foundation/Foundation.h>

@interface MCVideo : NSObject
@property(nonatomic,copy)NSString *videoId;
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *length;
@property(nonatomic,copy)NSString *videoURL;
@property(nonatomic,copy)NSString *imageURL;
@property(nonatomic,copy)NSString *desc;
@property(nonatomic,copy)NSString *teacher;
@end
#import "MCVideo.h"

@implementation MCVideo

- (NSString *)description{
    return [NSString stringWithFormat:@"videoID:%@--name:%@--length:%@--videoURL:%@--imageURL%@--desc:%@--teacher:%@",_videoId,_name,_length,_videoURL,_imageURL,_desc,_teacher];
}
@end
进行网络请求,根据返回的数据创建XMLParser对象.在XMLParser的代理方法中进行解析.

NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/videos.xml"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        if (connectionError == nil && data != nil && data.length > 0) {
            //根据data创建一个XMLParser解析器
            NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
            parser.delegate = self;
            //开始解析
            [parser parse];
        }
    }];
定义三个属性.一个可变数组,用来存储模型.一个模型,将XML文件转成模型需要用到.一个可变字符串,用来拼接(因为XML文件在解析的时候可能将一句话解析成好几句,所以需要用可变字符串将他们拼接起来,比如

<name>01.C语言-语法预览</name>,中间的一句可能解析成01. C语言  -语法预览三个部分)

//可变数组 用来存模型
@property(nonatomic,strong)NSMutableArray *videoArr;
//可变字符串 用来拼接
@property(nonatomic,strong)NSMutableString *strM;
//模型
@property(nonatomic,strong)MCVideo *video;

在XMLParser代理方法中自顶向下开始解析.

在刚开始解析的时候创建一个可变数组,用来存储模型.

解析到<videos>的时候什么也不做.

解析到<video>的时候创建模型对象,并且给模型的videoId的赋值.

在解析<name><length><videoURL>等标签之前清空可变字符串,防止把不同的内容拼接到一块.

解析两个标签之间的内容,解析的时候可能会将他们拆分成多个字符,使用可变字符串将他们拼接起来.

在解析到</name></length></videoURL>的时候给模型的name,length,videoURL等赋值

在解析到</video>的时候将模型添加到一开始创建的可变数组中

解析到</videos>的时候解析就全部完成了,最终是得到一个模型数组.

//XMLParser代理方法
//开始解析
- (void)parserDidStartDocument:(NSXMLParser *)parser{
    self.videoArr = [NSMutableArray array];
}
//解析标签
- (void)parser:(NSXMLParser *)parser didStartElement:(nonnull NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(nonnull NSDictionary<NSString *,NSString *> *)attributeDict{
    //清空字符串
    [self.strM setString:@""];
    if ([elementName isEqualToString:@"videos"]) {
        
    }else if ([elementName isEqualToString:@"video"]){
        self.video = [[MCVideo alloc]init];
        self.video.videoId = attributeDict[@"videoId"];
    }
}
//解析元素
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    [self.strM appendString:string];
}
//结束解析标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    if ([elementName isEqualToString:@"videos"]) {
        
    }else if ([elementName isEqualToString:@"video"]){
        [self.videoArr addObject:self.video];
    }else{
        [self.video setValue:self.strM forKey:elementName];
    }
}
//结束解析
- (void)parserDidEndDocument:(NSXMLParser *)parser{
//打印模型数组 
    NSLog(@"%@",self.videoArr);
}
打印结果:






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值