iPhone开发 NSXMLParser解析xml文件教程是本文要介绍的内容,本文主要是以代码实现的,来看代码。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* 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];
- //设置该类本身为代理类
- [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啦。
以上为个人的总结,希望对大家有帮助
小结:iPhone开发 NSXMLParser解析XML文件教程的内容介绍完了,希望本文对你有所帮助!