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);
}
打印结果: