iOS XML解析

一、什么是xml

可扩展标记语言标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。通常用于,系统配置、网络数据传输、跨平台数据交互等。具有结构清晰、跨平台、功能强大等优点。

二、xml解析方式

a)               SAX:事件驱动,逐行解析;优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:只需XML文档的少量内容,很少回头访问;机器内存少;

b)              DOM:文档驱动,构建文档树;优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。

三、NSXMLParse

books.xml

<?xml version="1.0" encoding="utf-8"?>

<books>
    <book>
        <author>施耐庵</author>
        <name>水浒传</name>
        <price>99.9</price>
    </book>
    
    <book>
        <author>吴承恩</author>
        <name>西游记</name>
        <price>99.9</price>
    </book>
    
    <book>
        <author>曹雪芹</author>
        <name>红楼梦</name>
        <price>99.9</price>
    </book>
    
    <book>
        <author>罗贯中</author>
        <name>三国演义</name>
        <price>99.9</price>
    </book>
</books>

Book.h

//
//  Book.h
//  JSONDemo
//
//  Created by LiLeo on 16/6/23.
//  Copyright © 2016年 LeoLi. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Book : NSObject

@property (nonatomic, copy) NSString * author;
@property (nonatomic, copy) NSString * name;
@property (nonatomic, strong) NSNumber * price;

@end

XMLParseUtil.h

//
//  XMLParseUtil.h
//  JSONDemo
//
//  Created by LiLeo on 16/6/23.
//  Copyright © 2016年 LeoLi. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface XMLParseUtil : NSObject <NSXMLParserDelegate>

- (void)startParse;

- (NSArray *)getBooks;

@end

XMLParseUtil.m

//
//  XMLParseUtil.m
//  JSONDemo
//
//  Created by LiLeo on 16/6/23.
//  Copyright © 2016年 LeoLi. All rights reserved.
//

#import "XMLParseUtil.h"
#import "Book.h"

@interface XMLParseUtil ()

@property (nonatomic, strong) NSMutableArray * array;//存储多本书

@property (nonatomic, strong) Book * book;//每一本书

@property (nonatomic, copy) NSString * currentElement;//当前属性

@property (nonatomic, strong) NSXMLParser * parser;//解析器

@end

@implementation XMLParseUtil

/**
 * 懒加载
 */
- (NSMutableArray *)array {
    if(_array == nil) {
        _array = [NSMutableArray array];
    }
    return _array;
}

/**
 * 懒加载
 */
- (NSXMLParser *)parser {
    if(_parser == nil) {
        NSBundle * bundle = [NSBundle mainBundle];
        NSString * path = [bundle pathForResource:@"books" ofType:@"xml"];
        NSData * data = [NSData dataWithContentsOfFile:path];
        _parser = [[NSXMLParser alloc] initWithData:data];
        _parser.delegate = self;
    }
    return _parser;
}

//开始文档
- (void)parserDidStartDocument:(NSXMLParser *)parser {
    NSLog(@"document start");
}

//文档结束
- (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@"document end");
    NSLog(@"%@", _book.author);
}

//开始元素
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict {
    _currentElement = elementName;
    if([elementName isEqualToString:@"book"]) {
        _book = [[Book alloc] init];
    }
}

//结束元素
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName {
    if([elementName isEqualToString:@"book"]) {
        [self.array addObject:_book];
    }
    _currentElement = nil;<span style="color:#ff0000;">//必须加上这句话,最终才会有数据 暂时不知道什么原因 有大牛知道的请指点一二,万分感谢</span>
}

//根据元素标签填补内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    NSLog(@"%@", string);
    if([_currentElement isEqualToString:@"author"]) {
        _book.author = string;
    }else if([_currentElement isEqualToString:@"name"]) {
        _book.name = string;
    }else if([_currentElement isEqualToString:@"price"]) {
        _book.price = [NSNumber numberWithFloat:[string floatValue]];
    }
}

//解析接口
- (void)startParse {
    [self.parser parse];
}

- (NSArray *) getBooks {
    return _array;
}

@end

JSONXMLParser解析xml文档采用的是事件驱动机制,解析速度快,占用内存少,但只能读,且数据不可逆。

四、GDataXML

GDataXML是谷歌提供的开源xml解析框架,是基于DOM文档对象模型方式的解析。

五、参考

a)               http://my.oschina.net/khakiloveyty/blog/396671

b)              http://blog.163.com/l1_jun/blog/static/143863882013102643156524/

c)               http://www.jianshu.com/p/a54d367adb2a

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬李先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值