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

来源:互联网 发布:惠普spectre 13知乎 编辑:程序博客网 时间:2024/05/16 08:31

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