ios 內建xml 解析,TBXMLParser解析

來源:互聯網
上載者:User

今天看了下蘋果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




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.