今天看瞭下蘋果xml 解析,寫瞭個小demo 心想還是 在博客上寫點東西吧,畢竟很久很久都沒有上來瞭
先上個效果圖把
接下來 看下 工程目錄圖吧vcD4KPHA+PGltZyBzcmM9″https://www.aiwalls.com/uploadfile/Collfiles/20140517/2014051709100115.png” alt=”\”>
本demo 分兩種解析模式,一是蘋果自帶的, 首先先看下蘋果自帶的吧,工程文件為 NoteXMLParser 文件 ,另一種解析模式 是 NotesTBXMLParser文件
NoteXMLParser.h 文件代碼如下 :
// // NoteXMLParser.h // TestXML // // Created by choni on 14-5-16. // Copyright (c) 2014年 choni. All rights reserved. // #import @interface NoteXMLParser : NSObject //解析出得數據,內部是字典類型 @property (strong,nonatomic) NSMutableArray * notes ; // 當前標簽的名字 ,currentTagName 用於存儲正在解析的元素名 @property (strong ,nonatomic) NSString * currentTagName ; //開始解析 - (void) start ; @end
NoteXMLParser.m 文件代碼如下:
// // NoteXMLParser.m // TestXML // // Created by choni on 14-5-16. // Copyright (c) 2014年 choni. All rights reserved. // #import "NoteXMLParser.h" @implementation NoteXMLParser // 開始解析 -(void)start{ NSString * path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"xml"]; NSURL * url = [NSURL fileURLWithPath:path]; //開始解析 xml NSXMLParser * parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; parser.delegate = self ; [parser parse]; NSLog(@"解析搞定..."); } //文檔開始時觸發 ,開始解析時 隻觸發一次 -(void)parserDidStartDocument:(NSXMLParser *)parser{ _notes = [NSMutableArray new]; } // 文檔出錯時觸發 -(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{ NSLog(@"%@",parseError); } //遇到一個開始標簽觸發 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ //把elementName 賦值給 成員變量 currentTagName _currentTagName = elementName ; //如果名字 是Note就取出 id if ([_currentTagName isEqualToString:@"Note"]) { NSString * _id = [attributeDict objectForKey:@"id"]; // 實例化一個可變的字典對象,用於存放 NSMutableDictionary *dict = [NSMutableDictionary new]; //把id 放入字典中 [dict setObject:_id forKey:@"id"]; // 把可變字典 放入到 可變數組集合_notes 變量中 [_notes addObject:dict]; } } #pragma mark 該方法主要是解析元素文本的主要場所,由於換行符和回車符等特殊字符也會觸發該方法,因此要判斷並剔除換行符和回車符 // 遇到字符串時 觸發 -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ //替換回車符 和空格,其中 stringByTrimmingCharactersInSet 是剔除字符的方法,[NSCharacterSet whitespaceAndNewlineCharacterSet]指定字符集為換行符和回車符; string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; if ([string isEqualToString:@""]) { return; } NSMutableDictionary * dict = [_notes lastObject]; if ([_currentTagName isEqualToString:@"CDate"] && dict) { [dict setObject:string forKey:@"CDate"]; } if ([_currentTagName isEqualToString:@"Content"] && dict) { [dict setObject:string forKey:@"Content"]; } if ([_currentTagName isEqualToString:@"UserID"] && dict) { [dict setObject:string forKey:@"UserID"]; } } //遇到結束標簽觸發 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ self.currentTagName = nil ; //該方法主要是用來 清理剛剛解析完成的元素產生的影響,以便於不影響接下來解析 } // 遇到文檔結束時觸發 -(void)parserDidEndDocument:(NSXMLParser *)parser{ [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadViewNotification" object:self.notes userInfo:nil]; //進入該方法就意味著解析完成,需要清理一些成員變量,同時要將數據返回給表示層(表示圖控制器) 通過廣播機制將數據通過廣播通知投送到 表示層 self.notes = nil; } @end
工程的控制器名稱為:chonViewController
chonViewController.h文件代碼如下:
// // chonViewController.h // TestXML // // Created by choni on 14-5-16. // Copyright (c) 2014年 choni. All rights reserved. // #import @interface chonViewController : UITableViewController // 保存數據列表 @property (nonatomic,strong) NSMutableArray *listdata ; @end
chonViewController.m文件代碼如下:
// // chonViewController.m // TestXML // // Created by choni on 14-5-16. // Copyright (c) 2014年 choni. All rights reserved. // #import "chonViewController.h" #import "NotesTBXMLParser.h" #import "NoteXMLParser.h" @interface chonViewController () @end @implementation chonViewController - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.leftBarButtonItem = self.editButtonItem; [[NSNotificationCenter defaultCenter ] addObserver:self selector:@selector(reloadView:) name:@"reloadViewNotification" object:nil]; //TBXMLParser 解析 // NotesTBXMLParser *parser = [NotesTBXMLParser new]; // // 開始解析 // [parser start]; // NSLog(@"viewDidLoad"); // 蘋果自帶解析 NoteXMLParser * parser = [NoteXMLParser new]; //開始解析 [parser start]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.listdata.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; NSMutableDictionary* dict = self.listdata[indexPath.row]; cell.textLabel.text = [dict objectForKey:@"Content"]; cell.detailTextLabel.text = [dict objectForKey:@"CDate"]; return cell; } #pragma mark - 處理通知 -(void)reloadView:(NSNotification*)notification { NSMutableArray *resList = [notification object]; self.listdata = resList; [self.tableView reloadData]; } @end
故事版圖如下:
截止到這裡 已經完成瞭 用蘋果自帶的解析器解析xml完畢瞭, 代碼中得註釋寫的很詳細!
接下來 看下 TBXMLParser解析模式
NotesTBXMLParser.h文件代碼如下
// // NotesTBXMLParser.h // TestXML // // Created by choni on 14-5-16. // Copyright (c) 2014年 choni. All rights reserved. // #import @interface NotesTBXMLParser : NSObject //解析出的數據內部是字典類型 @property (strong ,nonatomic) NSMutableArray * notes; // 開始解析 -(void) start ; @end
NotesTBXMLParser.m文件代碼如下:
// // NotesTBXMLParser.m // TestXML // // Created by choni on 14-5-16. // Copyright (c) 2014年 choni. All rights reserved. // #import "NotesTBXMLParser.h" #import "TBXML.h" @implementation NotesTBXMLParser //開始解析 -(void)start { _notes = [NSMutableArray new]; TBXML* tbxml = [[TBXML alloc] initWithXMLFile:@"Notes.xml" error:nil]; TBXMLElement * root = tbxml.rootXMLElement; // if root element is valid if (root) { TBXMLElement * noteElement = [TBXML childElementNamed:@"Note" parentElement:root]; while ( noteElement != nil) { NSMutableDictionary *dict = [NSMutableDictionary new]; TBXMLElement *CDateElement = [TBXML childElementNamed:@"CDate" parentElement:noteElement]; if ( CDateElement != nil) { NSString *CDate = [TBXML textForElement:CDateElement]; NSLog(@"CDate == %@",CDate); [dict setValue:CDate forKey:@"CDate"]; } TBXMLElement *ContentElement = [TBXML childElementNamed:@"Content" parentElement:noteElement]; if ( ContentElement != nil) { NSString *Content = [TBXML textForElement:ContentElement]; [dict setValue:Content forKey:@"Content"]; } TBXMLElement *UserIDElement = [TBXML childElementNamed:@"UserID" parentElement:noteElement]; if ( UserIDElement != nil) { NSString *UserID = [TBXML textForElement:UserIDElement]; [dict setValue:UserID forKey:@"UserID"]; } //獲得ID屬性 NSString *_id = [TBXML valueOfAttributeNamed:@"id" forElement:noteElement error:nil]; [dict setValue:_id forKey:@"id"]; [_notes addObject:dict]; noteElement = [TBXML nextSiblingNamed:@"Note" searchFromElement:noteElement]; } } NSLog(@"解析完成..."); [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadViewNotification" object:self.notes userInfo:nil]; self.notes = nil; } @end
OK 搞定, 最後在 chonVIewController.m 文件中得 viewLoad方法中調用就好瞭 !
最後聲明 :
TBXML解析xml 文檔采用的是 DOM解析模式,通過上面的比較,發現他是非常好的解析框架,速度是所有xml中最快的 ,下面簡單的介紹下如何使用
1.首先要到技術支持網站: https://www.tbxml.co.uk/TBXML/TBXML_Free.html 下載,下載完成後解壓 出 TBXML-Headers 和TBXML-Code文件 並添加到工程
2.該框架不支持ARC 因此在使用該框架運行時 會報ARC 錯誤,這裡就不吧 異常錯誤貼出來瞭 ,隻提供解決的方法,需要修改工程目錄中 TestXML-Prefix.pch 這個文件 ,在這個文件裡 加上宏:如下圖
#define ARC_ENABLED
3.由於TBXML依賴libz.dylib 庫,還需要在工程中Framework中添加這個庫,具體的添加方法 在這裡就不說瞭, 完成以上3個步驟 在進行編譯就可以啦!
今天先把xml 代碼貼出來瞭,後續還有json數據解析,下午如果有空的話,搞個demo 在弄上來吧,希望對有得人有所幫助,因為我是新手,哈哈!剛學,獻醜咯!
對瞭,xml文件內容如下”:
viewDidLoad