一、简介
一个常见的XML文档一般由以下部分组成
文档声明 <?xml version="1.0" encoding="UTF-8" ?>
元素(Element) <video>小黄人</video>
属性(Attribute) <video name="小黄人第01部"length="30" />
XML的解析方式有2种
DOM:一次性将整个XML文档加载进内存,比较适合解析小文件
SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件
在iOS中,解析XML的手段有很多
苹果原生
NSXMLParser:SAX方式解析,使用简单
第三方框架
libxml2:纯C语言,默认包含在iOSSDK中,同时支持DOM和SAX方式解析
GDataXML:DOM方式解析,由Google开发,基于libxml2
XML解析方式的选择建议
大文件:NSXMLParser、libxml2
小文件:GDataXML
一、解析方式
1、NSXMLParser(SAX方式 大文件)
使用步骤
NSXMLParser *parser = [[NSXMLParseralloc] initWithData:data]; // 传入XML数据,创建解析器
parser.delegate = self; // 设置代理,监听解析过程
[parser parse]; // 开始解析,会卡住,直到解析完毕
NSXMLParser-delegate
当扫描到文档的开始时调用(开始解析)
- (void)parserDidStartDocument:(NSXMLParser *)parser
当扫描到文档的结束时调用(解析完毕)
- (void)parserDidEndDocument:(NSXMLParser *)parser
当扫描到元素的开始时调用(attributeDict存放着元素的属性)
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementNamenamespaceURI:(NSString *)namespaceURIqualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
当扫描到元素的结束时调用
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementNamenamespaceURI:(NSString *)namespaceURIqualifiedName:(NSString *)qName
2、GDataXML(DOM方式 小文件)
GDataXML配置
GDataXML基于libxml2库,得做以下配置
导入libxml2库
设置libxml2的头文件搜索路径(为了能找到libxml2库的所有头文件)
在Head Search Path中加入/usr/include/libxml2
设置链接参数(自动链接libxml2库)
在OtherLinkerFlags中加入-lxml2
由于GDataXML是非ARC的,因此得设置编译参数
解析方式
// 1.加载文档
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
// 2.获得根元素
GDataXMLElement *root = doc.rootElement;
// 3.获得所有video元素
NSArray *elements = [root elementsForName:@"video"];
// 4.将GDataXMLElement对象转成HMVideo模型
NSMutableArray *videos = [NSMutableArray array];
for (GDataXMLElement *ele in elements) {
HMVideo *video = [[HMVideo alloc] init];
video.ID = [ele attributeForName:@"id"].stringValue.intValue; //一个一个元素的解析
video.length = [ele attributeForName:@"length"].stringValue.intValue;
video.name = [ele attributeForName:@"name"].stringValue;
video.image = [ele attributeForName:@"image"].stringValue;
video.url = [ele attributeForName:@"url"].stringValue;
[videos addObject:video];
}