XML解析:
SAX解析
— 从上往下,一点一点的进行读取。
— 性能好
— 苹果自带并推荐使用。
DOM方式
—一次性将XML文档以树形结构读入内存。
—内存的消耗比较大。
—在IOS开发中默认不支持DOM方式。但一些第三方框架实现了DOM方式。
— 只适合小的XML文件的解析。
—KissXML 和 GData原理都是以这种方式进行实现。
新建工程,打开本地服务器。效果显示如下所示:
第一步:导入GDataXML框架,首先GDataXML框架(其实就是两个文件(GdataXMLNode.h和GdataXMLNode.m))拖进工程,Command+B进行编译,发现有一个错误如下所示:
具体步骤如下:
接下来将常用的代码块保存到代码库并进行设置的具体步骤如下:
打开框架,需要掌握的方法有以下几个:
GDataXMLNode继承自NSObject,GdataXMLElement继承自GdataXMLNode
新建Model类,代码如下:
Video.h
#import <Foundation/Foundation.h>
@interface Video : NSObject
@property (nonatomic, copy) NSNumber *videoId;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSNumber *length;
@property (nonatomic, copy) NSString *videoURL;
@property (nonatomic, copy) NSString *imageURL;
@property (nonatomic, copy) NSString *desc;
@property (nonatomic, copy) NSString *teacher;
@property (nonatomic, readonly) NSString *time;
- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)videoWithDict:(NSDictionary *)dict;
@end
Video.m
#import "Video.h"
@implementation Video
- (instancetype)initWithDict:(NSDictionary *)dict {
self = [super init];
if (self) {
[self setValuesForKeysWithDictionary:dict];
}
return self;
}
+ (instancetype)videoWithDict:(NSDictionary *)dict {
return [[self alloc] initWithDict:dict];
}
- (NSString *)time {
int len = self.length.intValue;
return [NSString stringWithFormat:@"%02d:%02d:%02d", len / 3600, (len % 3600) / 60, (len % 60)];
}
- (NSString *)description {
return [NSString stringWithFormat:@"<%@ : %p> { videoId : %@, name : %@, length : %@, videoURL : %@, imageURL : %@, desc : %@, teacher : %@}", [self class], self, self.videoId, self.name, self.length, self.videoURL, self.imageURL, self.desc, self.teacher];
}
@end
viewController.m
//
// ViewController.m
// XML解析之DOM解析(GData)
//
// Created by apple on 15/10/27.
// Copyright (c) 2015年 LiuXun. All rights reserved.
//
#import "ViewController.h"
#import "GDataXML/GDataXMLNode.h"
#import "Video.h"
@interface ViewController ()
// 所有数据的容器
@property(nonatomic, strong)NSMutableArray *videos;
@end
@implementation ViewController
// 懒加载
-(NSMutableArray *)videos
{
if (_videos == nil) {
_videos = [[NSMutableArray alloc] init];
}
return _videos;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1. url
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/videos1.xml"];
// 2. 请求
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:2.0f];
// 3. 连接
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 直接将整个XML读入内存,对应的就是GDataXMLDocument对象
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data error:nil];
// NSLog(@"%@", document.rootElement.children); // document.rootElement对应于videos
for (GDataXMLElement *element in document.rootElement.children) {
// NSLog(@"----->%@", element); // 对应的是Video对象
// 创建一个Video对象
Video *video = [[Video alloc] init];
// 取出Video中的所有属性
for (GDataXMLElement *node in element.children) {
// NSLog(@"====%@ %@", node.name, node.stringValue);
// 在此给对象赋值
[video setValue:node.stringValue forKeyPath:node.name];
}
// 需要跟踪attributes
// NSLog(@"%@", element.attributes);
// 遍历element.attributes数组, 拿到属性值
// GDataXMLNode也可以用GDataXMLElement来替换。GDataXMLElement是GDataXMLNode的子类
for (GDataXMLNode *attr in element.attributes) {
// NSLog(@"attr.name= %@ attr.stringValue=%@ ", attr.name, attr.stringValue);
// 使用KVC赋值
[video setValue:attr.stringValue forKeyPath:attr.name];
}
// 将模型对象添加到数组
[self.videos addObject:video];
}
NSLog(@"%@", self.videos);
}];
}
@end
单独打印documen.rootElement.children 如下所示:
遍历documen.rootElement.children单独打印如下:
遍历取出模型Video对象中的属性
for (GDataXMLElement *node in element.children){
NSLog(@"====%@ %@", node.name, node.stringValue);
如下,打印如下:遍历打印element的attributes数组属性 如下
最后打印转化后的模型数组如下所示: