XMLのロード
ローカルにあるXMLファイルの読み込みをします。
ネットワーク越しにXMLを読み込むサンプルは結構あるんですが、ローカルにあるXMLファイルを読み込むサンプルがあまり見つからなかったので載せておきます。
XMLファイルはプロジェクト内のどこかに「既存のファイルを追加」で追加しておいてください。
とりあえず読み込みのコード
- (void) loadWithFile:(NSString *)fname{ NSLog(@"読み込みを開始します\n"); NSURL *urlPath = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:fname ofType:@"xml"]]; NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:urlPath]; [parser setDelegate:self]; [parser parse]; [parser release]; } - (void)parserDidStartDocument:(NSXMLParser *)parser { NSLog(@"解析を開始しました\n"); } - (void)parserDidEndDocument:(NSXMLParser *)parser { NSLog(@"解析が完了しました\n"); } - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { NSLog(@"読み込み時にエラーが発生しました\n"); } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ NSLog(@"\t\t要素[%@]が見つかりました\n", elementName); } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ NSLog(@"文字列[%@]が見つかりました\n", string); }
読み込みは実装したクラスのインスタンスを作成してloadWithFileをファイル名と一緒に呼びます。ここではTypeがXMLで指定してあるので、拡張子を抜いたファイル名のみを指定してください。
[obj loadWithFile:@"filename"];
下記データを読み出す場合
<?xml version="1.0" encoding="UTF-8"?> <data> <url addr="http://google.co.jp/" priority="2.5">Google</url> <url addt="http://yahoo.co.jp/" priority="1.5">Yahoo</url> </data>
データはattributeDictに入っているので、キーを指定して下記のように取り出します。
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ if([elementName isEqualToString:@"url"]){ NSString *urlStr = [attributeDict objectForKey:@"addr"] int priority = [[attributeDict objectForKey:@"priority"] floatValue] } }
間に挟まれた「Google」や「Yahoo」等の文字列は foundCharactersが呼ばれます。
didStartElementとdidEndElementの間に呼ばれるので、うまいこと拾ってください。