Ура! Выделил время и написал нужный мне апп для iPhone. Долго собирался, а делов то! В целом, за вечер написал. Естественно прост и без наваротов. Курс валют Украины :) Но если захотите, то прочтете эту статью и сами сделаете :) Если лень, можно скачать Exchange rates on iPhone Курс валют украины в iPhoneExchange rates on iPhone

Вот что у меня получилось:

Приведу примеры кода.
В парсинге мне помогла официальная книга от apple. Если интересно, то можно почитать про это на странице 311 в книге “The iPhone Developer`s Cookbook”.

Далее код и скомпилированная версия…

Класс для хранения информации:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class TreeNode;

@interface TreeNode : NSObject
{
TreeNode        *parent;
NSMutableArray  *children;
NSString        *key;
NSString        *leafvalue;
NSMutableDictionary *dattributes;

}
@property (nonatomic, retain)     TreeNode        *parent;
@property (nonatomic, retain)     NSMutableArray  *children;
@property (nonatomic, retain)     NSString        *key;
@property (nonatomic, retain)     NSString        *leafvalue;
@property (nonatomic, retain)     NSMutableDictionary    *dattributes;

@end

@implementation TreeNode
@synthesize parent
,    children
,    key
,    leafvalue
,    dattributes;
@end

Далее сам код который парсит и сохраняет данные в объект root:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
- (void)parseXMLFileAtFile {

NSURL *xmlURL = [NSURL URLWithString:@"http://bank-ua.com/export/currrate.xml"];
[self parseXMLFile:xmlURL];
}

// Use just one parser instance at any time
+ (NSXMLParser *) sharedInstance
{
if(!sharedInstance) {
sharedInstance = [[self alloc] init];
}
return sharedInstance;
}

// Public parser returns the tree root
- (TreeNode *)parseXMLFile: (NSURL *) url
{
stack = [[NSMutableArray alloc] init];

root = [[TreeNode alloc] init];
root.parent = NULL;
root.leafvalue = NULL;
root.children = [[NSMutableArray alloc] init];
root.dattributes = [[NSMutableDictionary alloc] init];
[stack addObject:root];
[root release];

NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[parser setDelegate:self];
[parser parse];
[parser release];

// pop down to real root
return [[root children] lastObject];
}

// Descend to a new element
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict
{
if (qName) elementName = qName;

currentElement = [elementName copy];

TreeNode *leaf = [[TreeNode alloc] init];

leaf.parent = [stack lastObject];

[(NSMutableArray *)[[stack lastObject] children] addObject:leaf];
leaf.key = [NSString stringWithString:elementName];
leaf.leafvalue = NULL;
leaf.children = [[NSMutableArray alloc] init];
leaf.dattributes = [[NSMutableDictionary alloc] initWithDictionary:attributeDict copyItems:YES];

[stack addObject:leaf];

[leaf release];
}
// Pop after finishing element
- (void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
{
[stack removeLastObject];
}

// Reached a leaf
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
[[stack lastObject] setLeafvalue:[NSString stringWithString:string]];
}

Ну а дальше на ваше усмотрение как это отбразить. Я предпочел временно в UITableView.

Для запуска вам возможно понадобиться зайти по ssh на свой телефон и прописать:
sysctl -w security.mac.proc_enforce=0 security.mac.vnode_enforce=0

Все в ваших руках :)