Objective-C学习之解析XML
通過soap請求webservice時,返回的數(shù)據(jù)是XML類型,有時候也需要解析本地的xml數(shù)據(jù)等,蘋果自帶類NSXMLParser解析xml還是很方便的,簡單輕便
本文以解析本地XML為例,網(wǎng)絡(luò)獲取到的返回值只需轉(zhuǎn)換成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>
我們用一個數(shù)組來存放,最終數(shù)據(jù)結(jié)構(gòu)為
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
// 遇到節(jié)點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
? ? // 轉(zhuǎn)化為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
? ? // 用數(shù)組存儲每一組信息
05
? ? finalArray = [[NSMutableArray alloc] init];
06
? ? ?
07
? ? ?
08
}
09
#pragma - mark 發(fā)現(xiàn)節(jié)點時
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
? ? ? ? ? ? // 關(guān)鍵節(jié)點開始時,初始化一個字典來存放值
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 發(fā)現(xiàn)節(jié)點值時
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 結(jié)束節(jié)點時
44
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
45??? javascript特效
{
46
? ? if (currentElement) {
47
? ? ? ? [rootDic setObject:currentValue forKey:currentElement];
48
? ? ? ? currentElement = nil;
49
? ? ? ? currentValue = nil;
50
? ? }
51
轉(zhuǎn)載于:https://www.cnblogs.com/xkzy/p/3811973.html
總結(jié)
以上是生活随笔為你收集整理的Objective-C学习之解析XML的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【★★★★★模板专区★★★★★】
- 下一篇: java.util.concurrent