iPhone开发 NSXMLParser解析XML文件教程

移动开发 iOS
本文介绍的是iPhone开发 NSXMLParser解析xml文件教程,很详细的介绍了如何计息XML的内容,先来想、看详细内容。

iPhone开发 NSXMLParser解析xml文件教程是本文要介绍的内容,本文主要是以代码实现的,来看代码。xml文件如下:Question.xml,放在Resource文件目录中

 

  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <Root>   
  3. <Question>   
  4. <QuestionTitle>你的学习成绩如何?</QuestionTitle>   
  5. <Answers>   
  6. <Answer>   
  7. <Result>主要科目成绩较好</Result>   
  8. <Evaluate>对自己的学习成绩一定要如实回答。</Evaluate>   
  9. </Answer>   
  10. <Answer>   
  11. <Result>大概可在中等偏上水平</Result>   
  12. <Evaluate>如果成绩不好则应说明理由。</Evaluate>   
  13. </Answer>   
  14. <Answer>   
  15. <Result>成绩特好,在我们班老数第一</Result>   
  16. <Evaluate>应表现出对学习的态度是认真的。</Evaluate>   
  17. </Answer>   
  18. </Answers>   
  19. </Question>   
  20. </Root>   
  21.  
  22. IVPaserXMLSingleton.h 文件如下   
  23.  
  24. #import <Foundation/Foundation.h>   
  25. #import "IVQuestionModel.h"   
  26. #import "IVAnswerModel.h"   
  27.  
  28. @interface IVPaserXMLSingleton : NSObject {   
  29. NSXMLParser*m_parser;                 //xml 解析类   
  30. IVQuestionModel* m_queModel;     //问题的封装类   
  31. IVAnswerModel* m_ansModel;        //问题答案的封装类   
  32. NSMutableArray* m_arrXMLNode;   //xml解析后的封装的array列表   
  33. }   
  34.  
  35. //实现单利方法   
  36. +(IVPaserXMLSingleton *) GetInstance;   
  37.  
  38. //解析xml文件 并将解析后的结果封装到列表中返回   
  39. - (NSMutableArray*) GetArrayByPaserXML;   
  40.  
  41. @end   
  42.  
  43. IVPaserXMLSingleton.m 文件如下,为单例类   
  44.  
  45. @implementation IVPaserXMLSingleton   
  46.  
  47. static IVPaserXMLSingleton *instance;  //单例对象   
  48. BOOL flag = YES;                               //是否为一个节点 重复的赋值   
  49. NSString* m_strCurrentElement;  //读到的当前节点的名   
  50.  
  51. + (IVPaserXMLSingleton *)GetInstance {   
  52. @synchronized(self) {   
  53. if (instance == nil) {   
  54. instance = [[self alloc] init];   
  55. }   
  56. }   
  57. return instance;   
  58. }   
  59.  
  60. - (NSMutableArray*) GetArrayByPaserXML {   
  61. //获取xml文件   
  62. NSString* pathpath = path = [[NSBundle mainBundle] pathForResource:@"Question" ofType:@"xml"];   
  63. NSFileHandle* file = [NSFileHandle fileHandleForReadingAtPath:path];   
  64. NSData* data = [file readDataToEndOfFile];   
  65. [file closeFile];   
  66.  
  67.        m_parser = [[NSXMLParser alloc] initWithData:data];   
  68.  
  69.         //设置该类本身为代理类   
  70.         [m_parser setDelegate:self];   
  71.  
  72. BOOL flag = [m_parser parse];   
  73. if (flag) {   
  74. NSLog(@"获取指定路径的xml文件成功");   
  75. } else {   
  76. NSLog(@"获取指定路径的xml文件失败");   
  77. }   
  78. [m_parser release];   
  79. return m_arrXMLNode;   
  80. }   
  81.  
  82. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName   
  83. namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *)qName   
  84. attributes: (NSDictionary *)attributeDict {   
  85. //读到开始标签 flag = YES   
  86. flag = YES;   
  87.  
  88. // 纪录当前解析的节点   
  89. m_strCurrentElement = elementName;   
  90.  
  91. ////读到xml的跟结点的开始标签   
  92. if ([elementName isEqualToString:@"Root"]) {   
  93. m_arrXMLNode = [[NSMutableArray alloc] init];   
  94. }   
  95.  
  96. //解析面试问题的xml文件   
  97. if ([m_xmlType isEqualToString:@"Question"]) {   
  98. if ([elementName isEqualToString:@"Question"]) {   
  99. m_queModel = [[IVQuestionModel alloc] init];   
  100. m_queModel.m_arrAnswers = [[NSMutableArray alloc] init];   
  101. } else if ([elementName isEqualToString:@"Answer"]) {   
  102. m_ansModel = [[IVAnswerModel alloc] init];   
  103. }   
  104. }   
  105. }   
  106.  
  107. -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {   
  108. if (flag) {   
  109. //解析面试问题的xml文件   
  110. if ([m_xmlType isEqualToString:@"Question"]) {   
  111. if ([m_strCurrentElement isEqualToString:@"QuestionTitle"]) {   
  112. m_queModel.m_strQuestionTitle = string;   
  113. } else if ([m_strCurrentElement isEqualToString:@"Result"]) {   
  114. m_ansModel.m_strResult = string;   
  115. } else if ([m_strCurrentElement isEqualToString:@"Evaluate"]) {   
  116. m_ansModel.m_strEvaluate = string;   
  117. }   
  118. }   
  119. }   
  120. }  
  1. -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {   
  2. //读到结束标签 flag = NO   
  3. flag = NO;   
  4.  
  5. //解析面试问题的xml文件   
  6. if ([m_xmlType isEqualToString:@"Question"]) {   
  7. if ([elementName isEqualToString:@"Question"]) {   
  8. [m_arrXMLNode addObject:m_queModel];   
  9. [[m_queModel m_arrAnswers] release];   
  10. [m_queModel release];   
  11. m_queModel = nil;   
  12. }   
  13. if ([elementName isEqualToString:@"Answer"]) {   
  14. [[m_queModel m_arrAnswers] addObject:m_ansModel];   
  15. [m_ansModel release];   
  16. m_ansModel = nil;   
  17. }   
  18. }   
  19. }   
  20.  
  21. - (void)parserDidStartDocument:(NSXMLParser *)parser {   
  22. NSLog(@"开始解析xml文件");   
  23. }   
  24.  
  25. - (void)parserDidEndDocument:(NSXMLParser *)parser {   
  26. NSLog(@"解析xml文件完成");   
  27. }   
  28. @end  

大致过程就是这样,常遇到的问题:

1、如果xml文件读取失败,可能是xml的文件格式不正确,可以在window下用ie打开该xml文件可以快速的查看是否xml文件的格式有问题。

2、如果节点的值过长,如<Result>...</Result>中间有很长一段内容,那么解析的过程中会将这段内容截成几段来读取,即:-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string方法会被重复的调用,直到所有的内容读取结束,所以这时如果用:m_ansModel.m_strResult = string;这种方式赋值,得到就会是不全的内容,解决办法是用NSMutableString类型的去接收读到的值,大概像这样:

  1. if (m_ansModel.m_strResult == nil) {   
  2. m_ansModel.m_strResult = [[NSMutableString alloc] initWithString:string];   
  3. } else {   
  4. [m_ansModel.m_strResult appendString:string];   
  5. }  

其中m_strResult为NSMutableString类型。就ok啦。

以上为个人的总结,希望对大家有帮助

小结:iPhone开发 NSXMLParser解析XML文件教程的内容介绍完了,希望本文对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-08-08 14:13:47

iPhone XML NSXMLParse

2011-08-22 12:01:38

iPhone开发文件

2011-08-10 15:48:10

iPhone网络

2011-08-02 17:37:01

IPhone开发 环境搭建

2011-07-08 16:02:24

iphone

2011-08-10 18:24:22

iPhone 图形 绘图

2011-07-08 14:58:16

iPhone Xcode iOS

2011-08-03 17:44:57

iPhone App 文件

2022-03-22 09:41:31

Java编程语言持久化

2011-07-21 10:29:18

iPhone 开发

2011-08-09 13:10:32

iPhone地图开发

2011-08-15 15:26:20

iPhone开发CocoaXML

2011-07-18 09:35:29

iPhone 框架

2010-07-26 15:06:29

Perl解析XML文件

2011-07-27 16:46:04

iPhone iPhone破解 MacPort

2011-08-12 10:09:23

iPhone开发多线程

2011-07-18 11:07:12

iPhone 游戏 引擎

2011-07-18 10:53:09

2011-08-15 11:31:27

iPhone开发日志

2011-08-16 10:01:02

点赞
收藏

51CTO技术栈公众号