NSXMLParser解析xml文件-ios

xml文件以下:Question.xml,放在Resource文件目錄中 
<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
<Question> 
<QuestionTitle>你的學習成績如何?</QuestionTitle> 
<Answers> 
<Answer> 
<Result>主要科目成績較好</Result> 
<Evaluate>對本身的學習成績必定要如實回答。</Evaluate> 
</Answer> 
<Answer> 
<Result>大概可在中等偏上水平</Result> 
<Evaluate>若是成績很差則應說明理由。</Evaluate> 
</Answer> 
<Answer> 
<Result>成績特好,在咱們班老數第一</Result> 
<Evaluate>應表現出對學習的態度是認真的。</Evaluate> 
</Answer> 
</Answers> 
</Question> 
</Root> 

IVPaserXMLSingleton.h 文件以下 

#import <Foundation/Foundation.h> 
#import "IVQuestionModel.h" 
#import "IVAnswerModel.h" 

@interface IVPaserXMLSingleton : NSObject { 
NSXMLParser*m_parser;                 //xml 解析類 
IVQuestionModel* m_queModel;     //問題的封裝類 
IVAnswerModel* m_ansModel;        //問題答案的封裝類 
NSMutableArray* m_arrXMLNode;   //xml解析後的封裝的array列表 


//實現單利方法 
+(IVPaserXMLSingleton *) GetInstance; 

//解析xml文件 並將解析後的結果封裝到列表中返回 
- (NSMutableArray*) GetArrayByPaserXML; 

@end 

IVPaserXMLSingleton.m 文件以下,爲單例類 

@implementation IVPaserXMLSingleton 

static IVPaserXMLSingleton *instance;  //單例對象 
BOOL flag = YES;                               //是否爲一個節點 重複的賦值 
NSString* m_strCurrentElement;  //讀到的當前節點的名 

+ (IVPaserXMLSingleton *)GetInstance { 
@synchronized(self) { 
if (instance == nil) { 
instance = [[self alloc] init]; 


return instance; 


- (NSMutableArray*) GetArrayByPaserXML { 
//獲取xml文件 
NSString* path = path = [[NSBundle mainBundle] pathForResource:@"Question" ofType:@"xml"]; 
NSFileHandle* file = [NSFileHandle fileHandleForReadingAtPath:path]; 
NSData* data = [file readDataToEndOfFile]; 
[file closeFile]; 

       m_parser = [[NSXMLParser alloc] initWithData:data]; 

        //設置該類自己爲代理類 
        [m_parser setDelegate:self]; 

BOOL flag = [m_parser parse]; 
if (flag) { 
NSLog(@"獲取指定路徑的xml文件成功"); 
} else { 
NSLog(@"獲取指定路徑的xml文件失敗"); 

[m_parser release]; 
return m_arrXMLNode; 


- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *)qName 
attributes: (NSDictionary *)attributeDict { 
//讀到開始標籤 flag = YES 
flag = YES; 

// 紀錄當前解析的節點 
m_strCurrentElement = elementName; 

////讀到xml的跟結點的開始標籤 
if ([elementName isEqualToString:@"Root"]) { 
m_arrXMLNode = [[NSMutableArray alloc] init]; 


//解析面試問題的xml文件 
if ([m_xmlType isEqualToString:@"Question"]) { 
if ([elementName isEqualToString:@"Question"]) { 
m_queModel = [[IVQuestionModel alloc] init]; 
m_queModel.m_arrAnswers = [[NSMutableArray alloc] init]; 
} else if ([elementName isEqualToString:@"Answer"]) { 
m_ansModel = [[IVAnswerModel alloc] init]; 




-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
if (flag) { 
//解析面試問題的xml文件 
if ([m_xmlType isEqualToString:@"Question"]) { 
if ([m_strCurrentElement isEqualToString:@"QuestionTitle"]) { 
m_queModel.m_strQuestionTitle = string; 
} else if ([m_strCurrentElement isEqualToString:@"Result"]) { 
m_ansModel.m_strResult = string; 
} else if ([m_strCurrentElement isEqualToString:@"Evaluate"]) { 
m_ansModel.m_strEvaluate = string; 





-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
//讀到結束標籤 flag = NO 
flag = NO; 

//解析面試問題的xml文件 
if ([m_xmlType isEqualToString:@"Question"]) { 
if ([elementName isEqualToString:@"Question"]) { 
[m_arrXMLNode addObject:m_queModel]; 
[[m_queModel m_arrAnswers] release]; 
[m_queModel release]; 
m_queModel = nil; 

if ([elementName isEqualToString:@"Answer"]) { 
[[m_queModel m_arrAnswers] addObject:m_ansModel]; 
[m_ansModel release]; 
m_ansModel = nil; 




- (void)parserDidStartDocument:(NSXMLParser *)parser { 
NSLog(@"開始解析xml文件"); 


- (void)parserDidEndDocument:(NSXMLParser *)parser { 
NSLog(@"解析xml文件完成"); 


@end 

大體過程就是這樣,常遇到的問題: 
1。若是xml文件讀取失敗,多是xml的文件格式不正確,能夠在window下用ie打開該xml文件能夠快速的查看是否xml文件的格式有問題。 
2。若是節點的值過長,如<Result>...</Result>中間有很長一段內容,那麼解析的過程當中會將這段內容截成幾段來讀取,即:-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string方法會被重複的調用,直到全部的內容讀取結束,因此這時若是用:m_ansModel.m_strResult = string;這種方式賦值,獲得就會是不全的內容,解決辦法是用NSMutableString類型的去接收讀到的值,大概像這樣: 
if (m_ansModel.m_strResult == nil) { 
m_ansModel.m_strResult = [[NSMutableString alloc] initWithString:string]; 
} else { 
[m_ansModel.m_strResult appendString:string]; 


其中m_strResult爲NSMutableString類型。就ok啦web

相關文章
相關標籤/搜索