iPhone開發 NSXMLParser解析XML檔案教程

來源:互聯網
上載者:User

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檔案教程的內容介紹完了,希望本文對你有所協助!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.