iPhone開發(fā) NSXMLParser解析XML文件教程
iPhone開發(fā) NSXMLParser解析xml文件教程是本文要介紹的內(nèi)容,本文主要是以代碼實(shí)現(xiàn)的,來看代碼。xml文件如下:Question.xml,放在Resource文件目錄中
- <?xml version="1.0" encoding="UTF-8"?>
- <Root>
- <Question>
- <QuestionTitle>你的學(xué)習(xí)成績(jī)?nèi)绾危?/span></QuestionTitle>
- <Answers>
- <Answer>
- <Result>主要科目成績(jī)較好</Result>
- <Evaluate>對(duì)自己的學(xué)習(xí)成績(jī)一定要如實(shí)回答。</Evaluate>
- </Answer>
- <Answer>
- <Result>大概可在中等偏上水平</Result>
- <Evaluate>如果成績(jī)不好則應(yīng)說明理由。</Evaluate>
- </Answer>
- <Answer>
- <Result>成績(jī)特好,在我們班老數(shù)第一</Result>
- <Evaluate>應(yīng)表現(xiàn)出對(duì)學(xué)習(xí)的態(tài)度是認(rèn)真的。</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列表
- }
- //實(shí)現(xiàn)單利方法
- +(IVPaserXMLSingleton *) GetInstance;
- //解析xml文件 并將解析后的結(jié)果封裝到列表中返回
- - (NSMutableArray*) GetArrayByPaserXML;
- @end
- IVPaserXMLSingleton.m 文件如下,為單例類
- @implementation IVPaserXMLSingleton
- static IVPaserXMLSingleton *instance; //單例對(duì)象
- BOOL flag = YES; //是否為一個(gè)節(jié)點(diǎn) 重復(fù)的賦值
- NSString* m_strCurrentElement; //讀到的當(dāng)前節(jié)點(diǎn)的名
- + (IVPaserXMLSingleton *)GetInstance {
- @synchronized(self) {
- if (instance == nil) {
- instance = [[self alloc] init];
- }
- }
- return instance;
- }
- - (NSMutableArray*) GetArrayByPaserXML {
- //獲取xml文件
- NSString* pathpath = path = [[NSBundle mainBundle] pathForResource:@"Question" ofType:@"xml"];
- NSFileHandle* file = [NSFileHandle fileHandleForReadingAtPath:path];
- NSData* data = [file readDataToEndOfFile];
- [file closeFile];
- m_parser = [[NSXMLParser alloc] initWithData:data];
- //設(shè)置該類本身為代理類
- [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 {
- //讀到開始標(biāo)簽 flag = YES
- flag = YES;
- // 紀(jì)錄當(dāng)前解析的節(jié)點(diǎn)
- m_strCurrentElement = elementName;
- ////讀到xml的跟結(jié)點(diǎn)的開始標(biāo)簽
- 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 {
- //讀到結(jié)束標(biāo)簽 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、如果節(jié)點(diǎn)的值過長(zhǎng),如<Result>...</Result>中間有很長(zhǎng)一段內(nèi)容,那么解析的過程中會(huì)將這段內(nèi)容截成幾段來讀取,即:-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string方法會(huì)被重復(fù)的調(diào)用,直到所有的內(nèi)容讀取結(jié)束,所以這時(shí)如果用:m_ansModel.m_strResult = string;這種方式賦值,得到就會(huì)是不全的內(nèi)容,解決辦法是用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啦。
以上為個(gè)人的總結(jié),希望對(duì)大家有幫助
小結(jié):iPhone開發(fā) NSXMLParser解析XML文件教程的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!