今天看了下蘋果xml 解析,寫了個小demo 心想還是 在部落格上寫點東西吧,畢竟很久很久都沒有上來了
先上個把
接下來 看下 工程目錄圖吧
本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 validif (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.首先要到支援人員網站: http://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 在弄上來吧,希望對有得人有所協助,因為我是新手,哈哈!剛學,獻醜咯!<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ttTBy6OseG1szsS8/sTayN3I58/C":
viewDidLoad