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進行解析:
- <?xml version="1.0" encoding="UTF-8"?>
- <result>
- <meeting addr="203">
- <creator>張一</creator>
- <member>
- <name>張二</name>
- <age>20</age>
- </member>
- <member>
- <name>張三</name>
- <age>21</age>
- </member>
- <member>
- <name>張四</name>
- <age>22</age>
- </member>
- </meeting>
- <meeting addr="204">
- <creator>李一</creator>
- <member>
- <name>李二</name>
- <age>20</age>
- </member>
- <member>
- <name>李三</name>
- <age>21</age>
- </member>
- <member>
- <name>李四</name>
- <age>22</age>
- </member>
- </meeting>
- </result>
1.獲取xml文件中的數據:存放到字符串中
- //bundle是一個目錄,包含了程序會使用到的資源
- NSString *path=[[NSBundle mainBundle] pathForResource:@"test" ofType:@"xml"];
- NSString *_xmlContent=[[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
用NSXMLParser實現解析:
- NSXMLParser解析簡要說明
- 1.是sax方法解析
- 2.需要創建NSXMLParser實例 (alloc)
- 並創建解析器 (initWithData:)
- 為解析器定義委托 (setDelegate:)
- 運行解析器 (parser)
- ++++++當parser初始化並執行parse語句時([parser parse]),程序會跳到代理方法里面走第一個代理方法++++++
- 3.這種解析方式是利用它的代理NSXMLParserDelegate實現的
- 第一個代理方法:開始處理xml數據,它會把整個xml遍歷一遍,識別元素節點名稱
- - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;
- 第二個代理方法:也就是得到文本節點里存儲的信息數據
- - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
- 第三個代理方法:存儲從第二個代理方法中獲取到的信息
- - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
- 這就是解析的過程,在這個過程中會不停的重復的執行這三個代理方法,直到遍歷完成
- 另外:
- 解析開始執行的方法
- - (void)parserDidStartDocument:(NSXMLParser *)parser;
- 解析結束執行的方法
- - (void)parserDidEndDocument:(NSXMLParser *)parser;
- 當出現解析錯誤的時候,會執行這個方法
- - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;
解析開始:
2.准備工作:
- NSXMLParser *parse=[[NSXMLParser alloc] initWithData:[_xmlContent dataUsingEncoding:NSUTF8StringEncoding]];
- [parse setDelegate:self];
- [parse parse];
- [parse release];
3.三個代理方法具體實現:
- //第一個代理方法:
- - (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
- {
- //判斷是否是meeting
- if ([elementName isEqualToString:@"meeting"]) {
- //判斷屬性節點
- if ([attributeDict objectForKey:@"addr"]) {
- //獲取屬性節點中的值
- NSString *addr=[attributeDict objectForKey:@"addr"];
- }
- }
- //判斷member
- if ([elementName isEqualToString:@"member"]) {
- NSLog(@"member"]);
- }
- }
- //第二個代理方法:
- - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
- {
- //獲取文本節點中的數據,因為下面的方法要保存這里獲取的數據,所以要定義一個全局變量(可修改的字符串)
- //NSMutableString *element = [[NSMutableString alloc]init];
- //這里要賦值為空,目的是為了清空上一次的賦值
- [element setString:@""];
- [element appendString:string];//string是獲取到的文本節點的值,只要是文本節點都會獲取(包括換行),然后到下個方法中進行判斷區分
- }
- //第三個代理方法:
- - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
- namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
- NSString *str=[[NSString alloc] initWithString:element];
- if ([elementName isEqualToString:@"creator"]) {
- NSLog(@"creator=%@",str);
- }
- if ([elementName isEqualToString:@"name"]) {
- NSLog(@"name=%@",str);
- }
- if ([elementName isEqualToString:@"age"]) {
- NSLog(@"age=%@",str);
- }
- [str release];
- }
解析xml數據的時候,
每當遇到元素節點的時候都會執行第一個代理方法,如果有屬性節點,可以直接在這個方法中獲取里面的值;
每當遇到文本節點的時候都會執行第二個代理方法,獲取文本節點中的值然后到第三個方法中進行區分。
如果是換行符的話也會獲取,因為換行符也是文本節點,不過當一個元素節點結束后的換行符是不會獲取的。
比如說:(換行符1)<li>文本節點</li>(換行符2)
元素節點前后各有一個換行符,這時只會獲取換行符1,而不會獲取換行符2。
4.處理錯誤:打印錯誤
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{ NSLog(@"%@",[parseError description]); }