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;

@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.stringValue);

如下,打印如下:


遍历打印element的attributes数组属性 如下


最后打印转化后的模型数组如下所示:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇