一、XML
什么是XML
全稱是Extensible Markup Language,譯作“可擴(kuò)展標(biāo)記語言”
跟JSON一樣,也是常用的一種用于交互的數(shù)據(jù)格式
一般也叫XML文檔(XML Document)-
一個(gè)常見的XML文檔一般由以下部分組成
- 文檔聲明
- 元素(Element)
- 屬性(Attribute)
二、XML 解析
-
XML的解析方式有2種
- DOM:一次性將整個(gè)XML文檔加載進(jìn)內(nèi)存治唤,比較適合解析小文件(apple 不推薦)
- SAX:從根元素開始,按順序一個(gè)元素一個(gè)元素往下解析糙申,比較適合解析大文件
-
在iOS中宾添,解析XML的手段有很多
蘋果原生
NSXMLParser:SAX方式解析,使用簡(jiǎn)單第三方框架
libxml2:純C語言柜裸,默認(rèn)包含在iOS SDK中缕陕,同時(shí)支持DOM和SAX方式解析
GDataXML:DOM方式解析,由Google開發(fā)疙挺,基于libxml2
-
XML解析方式的選擇建議
- 大文件:NSXMLParser
- 小文件:GDataXML扛邑、NSXMLParser
三、兩種解析方案
-
NSXMLParser的用法
- 創(chuàng)建解析器來解析
// 創(chuàng)建XML解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 設(shè)置代理
parser.delegate = self;
// 開始解析XML(parse方法是阻塞式的)
[parser parse];
- 2 . 代理對(duì)象要遵守NSXMLParserDelegate協(xié)議铐然,實(shí)現(xiàn)代理方法
/**
* 解析到某個(gè)元素的結(jié)尾(比如解析</videos>)
*/
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
}
/**
* 解析到某個(gè)元素的開頭(比如解析<videos>)
*/
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
}
/**
* 開始解析XML文檔
*/
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
}
/**
* 解析完畢
*/
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
}
-
GDataXML 用法
- 手動(dòng)導(dǎo)入框架蔬崩,添加依賴庫(kù)

Snip20150811_1.png
-
配置
Snip20150811_2.png

Snip20150811_3.png
-
設(shè)置非ARC標(biāo)記
Snip20150811_4.png 具體用法
// 加載整個(gè)文檔
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
// 獲得根節(jié)點(diǎn)
doc.rootElement;
// 獲得其他節(jié)點(diǎn)
[element elementsForName:@"video"];
// 獲得節(jié)點(diǎn)的屬性
[element attributeForName:@"name"].stringValue;