NSXMLParser 是基於 SAX 的解析器,也就是所謂的「事件驅動」解析器,所以使用 NSXMLParser 解析的關鍵就是實現 SAX 的時間處理器 --該事件處理器負責處理 NSXMLParser 解析 XML 過程當中的各類事件。網絡
NSXMLParser 解析的事件處理採用了委託,所以只要爲 NSXMLParser 指定一個 delegate 對象,該對象必須實現 NSXMLParserDelegate 協議app
使用 NSXMLParser 解析 XML 文檔的步驟:atom
<?xml version="1.0" encoding="UTF-8"?> <books> <book id="1"> <title>瘋狂iOS講義</title> <author>李剛 編著</author> <remark>基於最新版本的iOS 7</remark> </book> <book id="2"> <title>瘋狂Java講義</title> <author>李剛 編著</author> <remark>本書來自做者3年的Java培訓經歷,凝結了做者近3000個小時的授課經驗</remark> </book> <book id="3"> <title>輕量級Java EE企業應用實戰</title> <author>李剛 編著</author> <remark>本書主要介紹以Spring+Hibernate+Struts2爲基礎的Java EE應用</remark> </book> <book id="4"> <title>瘋狂Android講義</title> <author>李剛 編著</author> <remark>本書初版長期雄踞各網店、書店Android圖書銷量排行榜前列</remark> </book> </books>
#import <Foundation/Foundation.h> @interface FKBook : NSObject @property (nonatomic , assign) NSInteger bookID; @property (nonatomic , copy) NSString *title; @property (nonatomic , copy) NSString *author; @property (nonatomic , copy) NSString *remark; @end
.h文件:spa
#import <Foundation/Foundation.h> @interface FKXMLPraserDelegate : NSObject <NSXMLParserDelegate> // 定義一個NSMutableArray集合來保存解析XML文檔獲得的數據 @property (nonatomic, strong) NSMutableArray *books; @end
.m文件:code
#import "FKXMLPraserDelegate.h" #import "FKBook.h" @implementation FKXMLPraserDelegate // 定義一個FKBook對象,用於保存正在解析的<book>元素中的數據 FKBook* book; NSString* currentElementValue; // 當開始處理某個元素時觸發該方法 -(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { NSLog(@"開始處理元素 %@" , elementName); if([elementName isEqualToString:@"books"]) { // 若是正在處理根元素,在此處初始化存儲解析結果的NSMutableArray集合 self.books = [[NSMutableArray alloc] init]; } // 若是正在處理<book.../>元素 else if([elementName isEqualToString:@"book"]) { // 初始化FKBook對象 book = [[FKBook alloc] init]; // 從attributeDict中讀取<book.../>元素的屬性id的值 book.bookID = [[attributeDict objectForKey:@"id"] integerValue]; } } // 當開始處理字符串內容時觸發該方法 -(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { NSLog(@"處理字符串內容:%@",string); // 若是當前的字符串值不爲nil,保存當前正在處理的元素的值 if(string) { currentElementValue = string; } } // 當處理某個元素結束時觸發該方法 -(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { // 若是處理根元素結束,代表XML文檔處理完成。 if([elementName isEqualToString:@"books"]) { return; } // 若是處理<book.../>元素結束,則將封裝的FKBook對象添加到NSMutableArray集合中 else if([elementName isEqualToString:@"book"]) { [self.books addObject: book]; book = nil; } else { // 若是既不是處理<books.../>元素,也不是處理<book.../>元素的時候, // 則使用KVC方式爲當前FKBook對象的屬性賦值 [book setValue:currentElementValue forKey:elementName]; currentElementValue = nil; } } @end
// 獲取要解析的XML文檔的所在的URL(使用URL便可解析本地XML文檔,也可解析網絡XML文檔) NSURL* fileUrl = [[NSBundle mainBundle] URLForResource:@"books" withExtension:@"xml"]; // 獲取NSXMLParser實例對象 NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:fileUrl]; // 建立NSXMLParser解析的委託對象。 parserDeletage = [[FKXMLPraserDelegate alloc] init]; // 爲NSXMLParser指定委託對象,該委託對象就負責處理解析事件 parser.delegate = parserDeletage; // 開始解析, 解析結果會保存在委託對象的books屬性中 [parser parse];