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