XML的解析方式有2種
DOM:一次性將整個(gè)XML文檔加載進(jìn)內(nèi)存放钦,比較適合解析小文件
SAX:從根元素開始,按順序一個(gè)元素一個(gè)元素往下解析恭金,比較適合解析大文件
在iOS中操禀,解析XML的手段有很多
蘋果原生
NSXMLParser:SAX方式解析,使用簡(jiǎn)單
第三方框架
libxml2:純C語(yǔ)言横腿,默認(rèn)包含在iOSSDK中颓屑,同時(shí)支持DOM和SAX方式解析
GDataXML:DOM方式解析,由Google開發(fā)耿焊,基于libxml2
使用步驟
//傳入XML數(shù)據(jù)揪惦,創(chuàng)建解析器
NSXMLParser?*parser = [[NSXMLParser?alloc]?initWithData:data];
//設(shè)置代理,監(jiān)聽解析過(guò)程
parser.delegate?= self;
//開始解析
[parser?parse];
NSXMLParser采取的是SAX方式解析罗侯,特點(diǎn)是事件驅(qū)動(dòng)器腋,下面情況都會(huì)通知代理
當(dāng)掃描到文檔(Document)的開始與結(jié)束
當(dāng)掃描到元素(Element)的開始與結(jié)束
例子
// 0.請(qǐng)求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
// 1.創(chuàng)建請(qǐng)求對(duì)象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 2.發(fā)送請(qǐng)求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 創(chuàng)建XML解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 設(shè)置代理
parser.delegate = self;
// 開始解析XML
[parser parse]; // 阻塞式,即解析完再執(zhí)行下面代碼
// 刷新表格
[self.tableView reloadData];
}];
#pragma mark - <NSXMLParserDelegate>
/** * 解析到某個(gè)元素的結(jié)尾(比如解析) */
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
//? ? NSLog(@"didEndElement - %@", elementName);
}
/** * 解析到某個(gè)元素的開頭(比如解析)*/
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"videos"]) return;
//? ? XMGVideo *video = [[XMGVideo alloc] init];
//? ? video.mj_keyValues = attributeDict; // 第一種
XMGVideo *video = [XMGVideo mj_objectWithKeyValues:attributeDict]; // 第二種
[self.videos addObject:video];
}
/*** 開始解析XML文檔*/
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
//? ? NSLog(@"parserDidStartDocument");
}
/*** 解析完畢*/
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
//? ? NSLog(@"parserDidEndDocument");
}