iOS 中的 xml 解析
生活随笔
收集整理的這篇文章主要介紹了
iOS 中的 xml 解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在ios 中解析xml 的方法有很多種
1.蘋果原生
NSXMLParser:SAX方式解析,使用簡單
2.第三方框架
libxml2:純c語言,默認包含在ios ?sdk中,同時支持DOM 和 SAX 方式解析
GDataXML : DOM方式解析,由谷歌開發,基于libxml2
?
xml 解析建議方式:
大文件選用:NSXMLParser ? 或者?libxml2
小文件選用:GDataXML
xml解析:
SAX方式解析:
? ?從上往下,一點一點解析,性能比較好,也是蘋果推薦使用的。
DOM方式解析
? 一次性將xml文檔以樹形結構讀入內存,內存消耗比較大。適用于比較小的xml文件解析。在ios 開發中默認是不支持這種方式的解析。但是有一些第三方框架實現了這個方式,
KissXML & GData 都是采用DOM解析。
?
?
?
// // ViewController.m // 04-xml解析 // // Created by jerry on 15/9/28. // Copyright (c) 2015年 jerry. All rights reserved. // #import "ViewController.h" #import "Video.h" @interface ViewController ()<NSXMLParserDelegate> /*** 整個xml的數據容器*/ @property(nonatomic,strong)NSMutableArray *videos;/*** 第三步拼接字符串*/ @property(nonatomic,strong)NSMutableString *elementString; /*** 當前模型*/ @property(nonatomic,strong)Video *currentVideo; /*** 專門用來存儲表格所有的數據,也就是表格數據源*/ @property(nonatomic,strong)NSMutableArray *dataList; @end@implementation ViewController @synthesize videos = _videos; - (void)setDataList:(NSMutableArray *)dataList {_dataList = dataList;// 只要重新賦值 就要刷新 [self.tableView reloadData];// 隱藏刷新控件 [self.refreshControl endRefreshing]; } /*** 懶加載 初始化 自定義屬性*/ -(NSMutableArray *)videos {if (_videos == nil) {_videos = [NSMutableArray array];}return _videos; } /*** 懶加載 初始化 自定義屬性** @return <#return value description#>*/ - (NSMutableString *)elementString {if (_elementString == nil) {_elementString = [NSMutableString string];}return _elementString; } //- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // [self loadData]; //} -(void)loadView {[super loadView];[self loadData]; } /*** 加載xml 數據* 從第2步到第4步,可以拿到video的屬性。*/ - (IBAction)loadData {// 1.urlNSURL *url = [NSURL URLWithString:@"http://127.0.0.1/videos.xml"];// 2.請求// 不采用這個請求的原因就是因為他會有緩存,每次加載會先找緩存數據,這樣就會出現“幻覺”數據。// NSURLRequest *request = [NSURLRequest requestWithURL:url];// 這樣的請求 可以避免緩存數據,以免數據更改了 刷新ui 的時候還是顯示原來的數據。NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:2.0f];// 3.連接[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {// xml 解析// 1.實例化xml 解析器NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];// 2.設置代理parser.delegate = self;// 3.開始解析 [parser parse];}]; } #pragma mark - 代理方法 /*** 1.打開文檔 準備開始解析** @param parser <#parser description#>*/ - (void)parserDidStartDocument:(NSXMLParser *)parser {NSLog(@"打開文檔");// 初始化數組容器,清空容器,便于多次加載數據 [self.videos removeAllObjects]; }/*** 2.開始節點* 新建一個video對象,設置video的屬性,* @param parser <#parser description#>* @param elementName 元素名稱* @param namespaceURI <#namespaceURI description#>* @param qName <#qName description#>* @param attributeDict <#attributeDict description#>*/ - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {NSLog(@"開始節點---%@---%@",elementName,attributeDict);// 如果開始節點的名稱是video 就創建一個對象。if ([elementName isEqualToString:@"video"]) {self.currentVideo =[[Video alloc]init];// 設置videoidself.currentVideo.videoId = attributeDict[@"videoId"];}// 清空字符串內容 因為馬上要進行第3步,開始拼接當前節點內容[self.elementString setString:@""]; } /*** 3.發現節點里面內容** @param parser <#parser description#>* @param string <#string description#>*/ - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {NSLog(@"發現節點內容---%@",string);// 開始拼接[self.elementString appendString:string]; } /*** 4.結束節點** @param parser <#parser description#>* @param elementName <#elementName description#>* @param namespaceURI <#namespaceURI description#>* @param qName <#qName description#>*/ - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {NSLog(@"結束節點---%@",elementName);if ([elementName isEqualToString:@"video"]) {// 如果結束節點是video 需要把這個對象添加到數組 [self.videos addObject:self.currentVideo];}else if (![elementName isEqualToString:@"videos"]){// 利用kvc 進行賦值。可以省略注釋掉的代碼的麻煩。 [self.currentVideo setValue:self.elementString forKeyPath:elementName];}// // 如果結束節點,就可以把第二步創建的對象進行賦值,設置name/length屬性 // else if ([elementName isEqualToString:@"name"]) { // // 設置name 屬性 // self.currentVideo.name = self.elementString; // // }else if ([elementName isEqualToString:@"length"]) // { // // 設置length屬性 // // @([self.elementString integerValue]) 現將字符串轉成 數字,然后再將數字專程number // self.currentVideo.length = @([self.elementString integerValue]); // // } } /*** 5.結束文檔** @param parser <#parser description#>*/ - (void)parserDidEndDocument:(NSXMLParser *)parser {NSLog(@"結束文檔");// xml 真正解析結束 可以在主線程更新uidispatch_async(dispatch_get_main_queue(), ^{self.dataList =self.videos;}); }- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {return self.videos.count; } - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];Video *video = self.dataList[indexPath.row];cell.textLabel.text = video.name;return cell; }@end?
轉載于:https://www.cnblogs.com/pengpengzhang/p/4843594.html
總結
以上是生活随笔為你收集整理的iOS 中的 xml 解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Angularjs+Nodejs图片上传
- 下一篇: 日语的学习