iOS XML解析

来源:互联网 发布:下载刷赞软件 编辑:程序博客网 时间:2024/06/15 15:30

一、什么是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