Objective-C学习之解析XML

本文以解析本地XML为例,网络获取到的返回值只需转换成NSData型,解析是同理

需要解析的xml文件如下,users.xml

01 <?xml version="1.0" encoding="UTF-8"?>
02 <AllUsers>
03     <message>用户信息</message>
04     <user>
05         <name>芳仔小脚印</name>
06         <age>10</age>
07         <school>JiangSu University</school>
08     </user>
09     <user>
10         <name>毒虫</name>
11         <age>22</age>
12         <school>NanJing University</school>
13     </user>
14     <user>
15         <name>女神</name>
16         <age>23</age>
17         <school>HongKong University</school>
18     </user>
19 </AllUsers>

我们用一个数组来存放,最终数据结构为

01 (
02         {
03         message = "用户信息";
04     },
05         {
06         age = 10;
07         name = "芳仔小脚印";
08         school = "JiangSu University";
09     },
10         {
11         age = 22;
12         name = "毒虫";
13         school = "NanJing University";
14     },
15         {
16         age = 23;
17         name = "女神";
18         school = "HongKong University";
19     }
20 )

解析步骤 

一、声明代理 NSXMLParserDelegate

二、解析

01 // 遇到节点message和user时作为一个字典存放
02     NSArray *keyElements = [[NSArray alloc] initWithObjects:@"message",@"user", nil];
03     // 需要解析的字段
04     NSArray *rootElements = [[NSArray alloc] initWithObjects:@"message",@"name",@"age",@"school", nil];
05     // 获取xml文件的路径
06     NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"users" ofType:@"xml"];
07     // 转化为Data
08     NSData *data = [[NSData alloc] initWithContentsOfFile:xmlPath];
09      
10     // 初始化
11     NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];
12      
13     // 代理
14     xmlParser.delegate = self;
15     // 开始解析
16     BOOL flag = [xmlParser parse];
17     if (flag) {
18         NSLog(@"解析成功");
19     }
20     else{
21         NSLog(@"解析出错");
22     }

中间变量,在.m的interface的中定义

1 NSString *currentElement;
2      
3     NSString *currentValue;
4      
5     NSMutableDictionary *rootDic;
6      
7     NSMutableArray *finalArray;

代理方法

01 #pragma - mark 开始解析时
02 -(void)parserDidStartDocument:(NSXMLParser *)parser
03 {
04     // 用数组存储每一组信息
05     finalArray = [[NSMutableArray alloc] init];
06      
07      
08 }
09 #pragma - mark 发现节点时
10 -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
11 {
12     for(NSString *key in self.keyElements){
13         if ([elementName isEqualToString:key]) {
14             // 关键节点开始时,初始化一个字典来存放值
15             rootDic = nil;
16              
17             rootDic = [[NSMutableDictionary alloc] initWithCapacity:0];
18              
19         }
20         else {
21             for(NSString *element in self.rootElements){
22                 if ([element isEqualToString:element]) {
23                     currentElement = elementName;
24                     currentValue = [NSString string];
25                 }
26             }
27         }
28     }
29      
30 }
31 #pragma - mark 发现节点值时
32  
33 -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
34 {
35      
36     if (currentElement) {
37  
38         currentValue = string;
39         [rootDic setObject:string forKey:currentElement];
40     }
41      
42 }
43 #pragma - mark 结束节点时
44 -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
45 {
46     if (currentElement) {
47         [rootDic setObject:currentValue forKey:currentElement];
48         currentElement = nil;
49         currentValue = nil;
50     }
51     for(NSString *key in self.keyElements){
52  
53         if ([elementName isEqualToString:key]) {
54             // 关键节点结束时,将字典存放在数组中
55             if (rootDic) {
56  
57                 [finalArray addObject:rootDic];
58             }
59         }
60     }
61 }
62 #pragma - mark 结束解析
63 -(void)parserDidEndDocument:(NSXMLParser *)parser
64 {
65      
66 }

解析完成后,打印出finalArray为

view source
print ?
01 {
02         message = "\U7528\U6237\U4fe1\U606f";
03     },
04         {
05         age = 10;
06         name = "\U82b3\U4ed4\U5c0f\U811a\U5370";
07         school = "JiangSu University";
08     },
09         {
10         age = 22;
11         name = "\U6bd2\U866b";
12         school = "NanJing University";
13     },
14         {
15         age = 23;
16         name = "\U5973\U795e";
17         school = "HongKong University";
18     }
19 )

你可能感兴趣的:(网络,Objective-C,ios开发)