XML的解析方式有2種
DOM:一次性將整個XML文檔加載進內存,比較適合解析小文件
SAX:從根元素開始,按順序一個元素一個元素往下解析,比較適合解析大文件
在iOS中,解析XML的手段有很多
蘋果原生
NSXMLParser:SAX方式解析,使用簡單
第三方框架
libxml2:純C語言,默認包含在iOSSDK中,同時支持DOM和SAX方式解析
GDataXML:DOM方式解析,由Google開發,基于libxml2
使用步驟
//傳入XML數據,創建解析器
NSXMLParser?*parser = [[NSXMLParser?alloc]?initWithData:data];
//設置代理,監聽解析過程
parser.delegate?= self;
//開始解析
[parser?parse];
NSXMLParser采取的是SAX方式解析,特點是事件驅動,下面情況都會通知代理
當掃描到文檔(Document)的開始與結束
當掃描到元素(Element)的開始與結束
例子
// 0.請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
// 1.創建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 2.發送請求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 創建XML解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 設置代理
parser.delegate = self;
// 開始解析XML
[parser parse]; // 阻塞式,即解析完再執行下面代碼
// 刷新表格
[self.tableView reloadData];
}];
#pragma mark - <NSXMLParserDelegate>
/** * 解析到某個元素的結尾(比如解析) */
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
//? ? NSLog(@"didEndElement - %@", elementName);
}
/** * 解析到某個元素的開頭(比如解析)*/
- (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");
}