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