XML解析之DOM解析——利用第三方框架GDataXML进行XML解析,以及
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; @endVideo.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]; } @endviewController.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.stringValue); 如下,打印如下:
遍历打印element的attributes数组属性 如下
最后打印转化后的模型数组如下所示:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- weblogic.xml部署配置文件
- ruby-on-rails – Rails,link_to在URL中使用句点而不是/?
- 关于ssh 框架 applicationContext.xml文件中配置hibernate数
- ruby-on-rails-3 – 活动管理员has_many通过删除关联
- cocos3.4 lua 工程打包为apk后运行一段时间闪退的问题
- c# – 什么是TransactionScope默认超时值?
- ruby-on-rails – Rails Capistrano – SSHKit :: Command
- oop – 依赖注入是否违反了Demeter法则
- 初探Swift 3.0的重大变化
- xml – 小于运算符会导致xsl-if中的错误“未正确”