標籤:
一、解析文檔順序觸發的函數
1.parserDidStartDocument,在文檔的時候觸發。
2.parser:didStartElement:namespaceURI:qualifiedName:attributes,遇到一個開始標籤時觸發,其中namespaceURI部分是命名空間,qualifiedName是限定名,attributes是字典類型的屬性集合。
3.parser:foundCharacters,遇到字串是觸發。
4.parser:didEndElement:namespaceURI:qualifiedName,遇到結束標籤時觸發。
5.parserDidEndDocument,遇到文檔結束時觸發。
二、NSXMLParser是解析類,它有3個構造方法
1.initWithContentsOfURL,可以使用URL對象建立解析對象,本例中採用的是該方法,先從資源檔中載入獲得URL對象,再使用URL對象構建解析對象。
2.initWithData,可以使用NSData建立解析對象。
3.initWithStream,可以使用IO流對象建立解析對象。
解析對象建立好後需要指定委託屬性對象delegate為self,然後發送parse訊息,開始解析文檔。
三、代碼
NotesXMLParser.h
#import <Foundation/Foundation.h>@interface NotesXMLParser : NSObject <NSXMLParserDelegate>//解析出的資料內部是字典類型@property (strong,nonatomic) NSMutableArray *notes;//當前標籤的名字@property (strong,nonatomic) NSString *currentTagName;//開始解析-(void)start;@end
NotesXMLParser.m
#import "NotesXMLParser.h"@implementation NotesXMLParser-(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 *)qualifiedName attributes:(NSDictionary *)attributeDict{ _currentTagName = elementName; if ([_currentTagName isEqualToString:@"Note"]) { NSString *_id = [attributeDict objectForKey:@"id"]; NSMutableDictionary *dict = [NSMutableDictionary new]; [dict setObject:_id forKey:@"id"]; [_notes addObject:dict]; } }//遇到字串時候觸發- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ //替換斷行符號符和空格 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
IOS 解析XML--使用NSXML