Курс валют на iPhone (parse XML Files)
Categories: iPhone, OOP on Jan.03, 2009
Ура! Выделил время и написал нужный мне апп для iPhone. Долго собирался, а делов то! В целом, за вечер написал. Естественно прост и без наваротов. Курс валют Украины :) Но если захотите, то прочтете эту статью и сами сделаете :) Если лень, можно скачать Exchange 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
Все в ваших руках :)
Similar posts:

January 29th, 2009 on 4:12 pm
Спасибо за статью. В частности мне был интересен пример с NSMutableArray.
Помогло.
P.S. Не \"привиду\" статью, а \"приведу\" :)
August 25th, 2011 on 8:27 pm
Целиком на пример моно посмотреть? А то что то при парсинге с нашего цб говорит что кодировка его не устраивает – хотя файл курсов такойже как в Украине