iOS關於XML解析請求數據


XML數據的請求:

 

和json請求幾乎一樣,只有請求參數修改為xml即可:

1 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
2 manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
3 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/atom+xml", nil];

XML數據的解析:

對xml進行解析:

 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <result>  
  3.     <meeting addr="203">  
  4.         <creator>張一</creator>  
  5.         <member>  
  6.             <name>張二</name>  
  7.             <age>20</age>  
  8.         </member>  
  9.         <member>  
  10.             <name>張三</name>  
  11.             <age>21</age>  
  12.         </member>  
  13.         <member>  
  14.             <name>張四</name>  
  15.             <age>22</age>  
  16.         </member>  
  17.     </meeting>  
  18.       
  19.     <meeting addr="204">  
  20.         <creator>李一</creator>  
  21.         <member>  
  22.             <name>李二</name>  
  23.             <age>20</age>  
  24.         </member>  
  25.         <member>  
  26.             <name>李三</name>  
  27.             <age>21</age>  
  28.         </member>  
  29.         <member>  
  30.             <name>李四</name>  
  31.             <age>22</age>  
  32.         </member>  
  33.     </meeting>  
  34. </result>  

 

1.獲取xml文件中的數據:存放到字符串中

 
  1. //bundle是一個目錄,包含了程序會使用到的資源  
  2.     NSString *path=[[NSBundle mainBundle] pathForResource:@"test" ofType:@"xml"];  
  3.     NSString *_xmlContent=[[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];  


用NSXMLParser實現解析:

 
  1. NSXMLParser解析簡要說明  
  2.          1.是sax方法解析  
  3.          2.需要創建NSXMLParser實例 (alloc)  
  4.                並創建解析器 (initWithData:)  
  5.                   為解析器定義委托 (setDelegate:)  
  6.                       運行解析器 (parser)  
  7.          ++++++當parser初始化並執行parse語句時([parser parse]),程序會跳到代理方法里面走第一個代理方法++++++  
  8.          3.這種解析方式是利用它的代理NSXMLParserDelegate實現的  
  9.          第一個代理方法:開始處理xml數據,它會把整個xml遍歷一遍,識別元素節點名稱  
  10.          - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;  
  11.          第二個代理方法:也就是得到文本節點里存儲的信息數據  
  12.          - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;  
  13.          第三個代理方法:存儲從第二個代理方法中獲取到的信息  
  14.          - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName  
  15.          這就是解析的過程,在這個過程中會不停的重復的執行這三個代理方法,直到遍歷完成  
  16.            
  17.          另外:  
  18.              解析開始執行的方法  
  19.          - (void)parserDidStartDocument:(NSXMLParser *)parser;  
  20.              解析結束執行的方法  
  21.          - (void)parserDidEndDocument:(NSXMLParser *)parser;  
  22.              當出現解析錯誤的時候,會執行這個方法  
  23.          - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;  

 

 

解析開始:

2.准備工作:

 
  1. NSXMLParser *parse=[[NSXMLParser alloc] initWithData:[_xmlContent dataUsingEncoding:NSUTF8StringEncoding]];  
  2.         [parse setDelegate:self];  
  3.         [parse parse];  
  4.         [parse release];  


3.三個代理方法具體實現:

 
  1. //第一個代理方法:  
  2. - (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict   
  3. {  
  4.     //判斷是否是meeting  
  5.     if ([elementName isEqualToString:@"meeting"]) {  
  6.         //判斷屬性節點  
  7.         if ([attributeDict objectForKey:@"addr"]) {  
  8.             //獲取屬性節點中的值  
  9.             NSString *addr=[attributeDict objectForKey:@"addr"];  
  10.         }  
  11.     }  
  12.     //判斷member  
  13.     if ([elementName isEqualToString:@"member"]) {  
  14.         NSLog(@"member"]);  
  15.     }  
  16. }  
  17.   
  18. //第二個代理方法:  
  19. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string   
  20. {  
  21.     //獲取文本節點中的數據,因為下面的方法要保存這里獲取的數據,所以要定義一個全局變量(可修改的字符串)  
  22.     //NSMutableString *element = [[NSMutableString alloc]init];  
  23.     //這里要賦值為空,目的是為了清空上一次的賦值  
  24.     [element setString:@""];  
  25.     [element appendString:string];//string是獲取到的文本節點的值,只要是文本節點都會獲取(包括換行),然后到下個方法中進行判斷區分  
  26. }  
  27.   
  28. //第三個代理方法:  
  29. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName  
  30. namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {  
  31.       
  32.     NSString *str=[[NSString alloc] initWithString:element];  
  33.       
  34.     if ([elementName isEqualToString:@"creator"]) {  
  35.         NSLog(@"creator=%@",str);  
  36.     }  
  37.     if ([elementName isEqualToString:@"name"]) {  
  38.         NSLog(@"name=%@",str);  
  39.     }  
  40.     if ([elementName isEqualToString:@"age"]) {  
  41.         NSLog(@"age=%@",str);  
  42.     }  
  43.     [str release];  
  44. }  

 

鏈接:
 
注意:

解析xml數據的時候,

每當遇到元素節點的時候都會執行第一個代理方法,如果有屬性節點,可以直接在這個方法中獲取里面的值;

每當遇到文本節點的時候都會執行第二個代理方法,獲取文本節點中的值然后到第三個方法中進行區分。

如果是換行符的話也會獲取,因為換行符也是文本節點,不過當一個元素節點結束后的換行符是不會獲取的。

比如說:(換行符1)<li>文本節點</li>(換行符2)

元素節點前后各有一個換行符,這時只會獲取換行符1,而不會獲取換行符2。

4.處理錯誤:打印錯誤

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{  
    NSLog(@"%@",[parseError description]);  
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM