NSXMLParser

1. 使用 NSXMLParser解析XML文檔

NSXMLParser 是基於 SAX 的解析器,也就是所謂的「事件驅動」解析器,所以使用 NSXMLParser 解析的關鍵就是實現 SAX 的時間處理器 --該事件處理器負責處理 NSXMLParser 解析 XML 過程當中的各類事件。網絡

NSXMLParser 解析的事件處理採用了委託,所以只要爲 NSXMLParser 指定一個 delegate 對象,該對象必須實現 NSXMLParserDelegate 協議app

使用 NSXMLParser 解析 XML 文檔的步驟:atom

  1. 建立 NSXMLParser 對象
  2. 爲 NSXMLParser 對象指定 delegate ,該 delegate 須要實現 NSXMLParserDelegate 協議
  3. 調用 NSXMLParser 對象的 parse 方法開始解析

2. NSXMLParserDelegate

  • -parserDidStartDocument:
    • 開始處理 XML 文檔時激發
  • -parserDidEndDocument:
    • 結束處理 XML 文檔時激發
  • -parser:didStartElement:namespaceURI:qualifiedName:attributes:
    • 開始處理 XML 元素時激發
  • -parser:didEndElement:namespaceURI:qualifiedName:
    • 結束處理 XML 元素時激發
  • -parser:didStartMappingPrefix:toURI:
  • -parser:didEndMappingPrefix:
  • -parser:resolveExternalEntityName:systemID:
    • 開始處理外部實體時激發
  • -parser:parseErrorOccurred:
    • 解析出現錯誤時激發
  • -parser:validationErrorOccurred:
    • XML 文檔驗證錯誤時激發
  • -parser:foundCharacters:
    • 解析 XML 文檔遇到字符串內容時激發
  • -parser:foundIgnorableWhitespace:
    • 解析 XML 文檔遇到空白時激發
  • -parser:foundProcessingInstructionWithTarget:data:
    • 解析XML文檔處理指令時激發
  • -parser:foundComment:
    • 處理 XML 文檔的註釋時激發
  • -parser:foundCDATA:
    • 處理 XML 文檔的 CDATA 內容時激發

3. 代碼示例:

3.1 XML 文件

<?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>

3.2 model 類

#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

3.3 自定義 delegate

.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

3.4 調用

// 獲取要解析的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];
相關文章
相關標籤/搜索