ios 自帶xml 解析,TBXMLParser解析 – iPhone手機開發技術文章 iPhone軟體開發教學課程

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *