iPhone开发 NSXMLParser解析XML文件教程
iPhone开发 NSXMLParser解析xml文件教程是本文要介绍的内容,本文主要是以代码实现的,来看代码。xml文件如下:Question.xml,放在Resource文件目录中[*]<?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?>
[*]<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 &quot;IVQuestionModel.h&quot;
[*]#import &quot;IVAnswerModel.h&quot;
[*]
[*]@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 = [ init];
[*]}
[*]}
[*]return instance;
[*]}
[*]
[*]- (NSMutableArray*) GetArrayByPaserXML {
[*]//获取xml文件
[*]NSString* pathpath = path = [ pathForResource:@&quot;Question&quot; ofType:@&quot;xml&quot;];
[*]NSFileHandle* file = ;
[*]NSData* data = ;
[*];
[*]
[*] m_parser = [ initWithData:data];
[*]
[*] //设置该类本身为代理类
[*] ;
[*]
[*]BOOL flag = ;
[*]if (flag) {
[*]NSLog(@&quot;获取指定路径的xml文件成功&quot;);
[*]} else {
[*]NSLog(@&quot;获取指定路径的xml文件失败&quot;);
[*]}
[*];
[*]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 () {
[*]m_arrXMLNode = [ init];
[*]}
[*]
[*]//解析面试问题的xml文件
[*]if () {
[*]if () {
[*]m_queModel = [ init];
[*]m_queModel.m_arrAnswers = [ init];
[*]} else if () {
[*]m_ansModel = [ init];
[*]}
[*]}
[*]}
[*]
[*]-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
[*]if (flag) {
[*]//解析面试问题的xml文件
[*]if () {
[*]if () {
[*]m_queModel.m_strQuestionTitle = string;
[*]} else if () {
[*]m_ansModel.m_strResult = string;
[*]} else if () {
[*]m_ansModel.m_strEvaluate = string;
[*]}
[*]}
[*]}
[*]}
[*]-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
[*]//读到结束标签 flag = NO
[*]flag = NO;
[*]
[*]//解析面试问题的xml文件
[*]if () {
[*]if () {
[*];
[*][ release];
[*];
[*]m_queModel = nil;
[*]}
[*]if () {
[*][ addObject:m_ansModel];
[*];
[*]m_ansModel = nil;
[*]}
[*]}
[*]}
[*]
[*]- (void)parserDidStartDocument:(NSXMLParser *)parser {
[*]NSLog(@&quot;开始解析xml文件&quot;);
[*]}
[*]
[*]- (void)parserDidEndDocument:(NSXMLParser *)parser {
[*]NSLog(@&quot;解析xml文件完成&quot;);
[*]}
[*]@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 = [ initWithString:string];
[*]} else {
[*];
[*]}
其中m_strResult为NSMutableString类型。就ok啦。
以上为个人的总结,希望对大家有帮助
小结:iPhone开发 NSXMLParser解析XML文件教程的内容介绍完了,希望本文对你有所帮助!
【编辑推荐】
[*]详解iOS平台XML解析类库对比和安装说明
[*]使用Cocoa保存XML格式记录文件
[*]iPhone实现XML的POST传递并接收数据
[*]iOS学习之路 XML处理
[*]通过Makefile在iPhone下创建Dylib实例
[*]深度解析iPhone中项目单元测试
页:
[1]