`
反求诸己
  • 浏览: 543211 次
  • 性别: Icon_minigender_1
  • 来自: 湖南娄底
社区版块
存档分类
最新评论

iphone开发 NSXMLParser解析xml文件

 
阅读更多

 

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* 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啦。

分享到:
评论

相关推荐

    iphone开发之xml解析

    本篇将详细讲解iPhone开发中的XML解析技术。 首先,XML解析是将XML文档转换为程序可以理解的数据结构的过程。在iOS开发中,有两种主要的XML解析方式:DOM(Document Object Model)和SAX(Simple API for XML)。 ...

    iphone开发xml解析

    本文将深入探讨在iPhone应用开发中如何有效地解析XML数据。 #### XML解析的意义 在iPhone应用开发中,XML解析主要用于从服务器获取的数据中提取有用的信息。这涉及到理解服务器端返回的XML结构,并将其转换为应用...

    iphone开发XML解析

    在iPhone开发中,苹果提供了两种主要的XML解析方法:KissXML和NSXMLParser。KissXML是一个Objective-C库,它是libxml2的Objective-C封装,提供了更灵活且强大的XML处理能力;NSXMLParser是苹果自带的XML解析器,适用...

    iphone中XML解析例子

    1. 使用NSXMLParser解析XML: NSXMLParser是一个Objective-C类,它会在解析过程中触发一系列的代理方法。你需要实现这些方法来处理XML元素的开始、结束、属性等。例如,`-parser:didStartElement:namespaceURI:...

    iPhone/iPad 开发: 解析本地/网络上的xml文件(实例建附件)

    在iOS开发中,我们可以使用苹果提供的Foundation框架中的`NSXMLParser`类来解析XML数据。 1. **本地XML文件解析** - 使用`NSBundle`类获取资源:在iOS应用中,通常将XML文件作为资源文件打包在.app中。可以使用`...

    iPhone IOS XML解析源代码

    在这个"XMLPerformance"压缩包中,可能包含了两个工程或测试用例,分别演示了如何使用NSXMLParser和GDataXML解析XML,并进行了性能对比。通过运行这些代码,你可以直观地看到在相同XML数据集上,哪种解析方法的执行...

    iphone Reachability NSConnection NSXMLParser

    3. NSConnection接收到数据后,启动NSXMLParser解析XML内容。 4. 实现NSXMLParserDelegate协议,定义处理XML元素的回调方法,将解析出的数据转化为应用程序所需的模型对象。 5. 将解析好的数据展示给用户或存储到...

    iphone NSXMLParser

    在标题“iPhone NSXMLParser”中,我们关注的是如何在iPhone应用程序中使用`NSXMLParser`来解析XML文件。这个过程通常包括以下步骤: 1. **初始化解析器**:首先,你需要创建一个`NSXMLParser`实例,并传入XML数据...

    iphone开发之xml解析流程小结

    本文将深入探讨iPhone开发中的XML解析流程,帮助开发者更好地理解和使用这一技术。 首先,我们要了解XML的基本概念。XML是一种自描述性的标记语言,它的结构清晰,易于人阅读,同时也方便机器解析。在iOS开发中,...

    iPhone编程解析xml

    本教程将深入探讨如何在iPhone应用程序中解析XML文件,主要涉及的技术点包括Objective-C编程、网络连接以及NSXMLParser类的使用。 首先,我们要了解XML的基本结构。XML文档由元素、属性、文本内容等组成,通过层次...

    iphone 解析XML的demo

    而NSXMLParser是苹果提供的API,它以事件驱动的方式解析XML,适合小到中等大小的文件。 在"XMLParse"这个Demo中,我们很可能会看到以下关键知识点: 1. **NSXMLParser**: 这是iOS SDK中用于解析XML的主要类。...

    iPhone解析XML显示网络上的照片

    在iPhone或iPad开发过程中,解析XML数据、实现网络连接及与服务器交互等是常见的需求。本文将以“iPhone解析XML显示网络上的照片”为主题,深入探讨如何从零开始构建一个简单的iOS照片幻灯片应用程序。通过实践操作...

    iphone中xml的解析demo

    本示例"iphone中xml的解析demo"是基于iPhone SDK的NSXMLParserDelegate进行的,旨在帮助初学者理解如何在iOS应用中解析XML数据。 首先,我们要了解NSXMLParser。它是Apple提供的一个解析XML文档的类,遵循...

    iphone,xml多种解析方法

    GDataXML是Google开源的一个Objective-C库,基于libxml2,提供了一种简单的方式来解析XML文档。它提供了强大的XPath查询支持,可以方便地定位到XML文档中的特定节点。但是,GDataXML相对其他解析器来说,内存消耗较...

    iPhone xml rss解析

    在iPhone应用开发中,我们可以利用iOS SDK中的Foundation框架提供的NSXMLParser类来解析XML数据。NSXMLParser提供了一种事件驱动的解析方法,即在解析过程中遇到特定的XML节点时,会触发相应的代理方法。我们需要...

    xml.zip_iphone访问webservice视频_xml_数据解析

    - iOS提供了NSXMLParser类,可以逐事件地解析XML文档,如开始元素、结束元素、字符数据等。 - GDataXMLNode和GDataXMLDocument是Google提供的XML解析库,提供了更友好的API来查询和操作XML树。 - 还可以使用第三...

    移动开发-基于XML树状结构的iPhone用户界面生成技术研究.pdf

    当解析XML文件时,NSXMLParser会逐个处理XML元素,并触发相应的事件,如开始元素、结束元素、字符数据等。开发人员可以设置代理方法来响应这些事件,根据XML结构动态地创建和配置界面元素。 例如,XML文件可能会...

    XMLParser iphone

    XMLParser在iOS开发中是一种常用的解析XML数据的工具,它允许开发者将XML文件转换为可操作的数据结构,便于在iPhone应用程序中使用。XML(Extensible Markup Language)是一种标记语言,常用于存储和传输结构化数据...

    iOS开发中常见的解析XML的类库以及简要安装方法

    在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML、TouchXML、KissXML、TinyXML和GDataXML。问题是应该选择哪一个呢? 解析 XML 通常有两...

    XML.zip_XML 解析_c xml_sbjson x_xml

    在iOS开发中,我们可以使用Cocoa Touch框架中的`NSXMLParser`类来解析XML文档。`NSXMLParser`是一个事件驱动的解析器,它会逐个处理XML文档的元素,触发相应的回调方法,例如`parser:didStartElement:`和`parser:...

Global site tag (gtag.js) - Google Analytics