今日はすでに簡単な NSXMLParser の例を書いていたので、それを取り上げて、あなたが説明した XML を解析させました。
作業サンプル プロジェクトはこちら: https://github.com/erikt/ETParseIntuitSOExample
NSXMLParser デリゲートは、あなたが求めているものです。ヘッダーは次のとおりです。
#import <Foundation/Foundation.h>
@interface ETIntuitParser : NSObject<NSXMLParserDelegate>
+ (NSDictionary *)parseIntuitXML:(NSString *)xml;
@end
そして実装:
#import "ETIntuitParser.h"
@interface ETIntuitParser ()
@property NSUInteger dataColNumber;
@property (copy,nonatomic) NSString *dataKey;
@property (strong,nonatomic) NSMutableString *currentElementValue;
@property (strong,nonatomic) NSMutableDictionary *resultDict;
@end
@implementation ETIntuitParser
+ (NSDictionary *)parseIntuitXML:(NSString *)xml {
ETIntuitParser *intuitParser = [[ETIntuitParser alloc] init];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:[xml dataUsingEncoding:NSUTF8StringEncoding]];
[xmlParser setDelegate:intuitParser];
BOOL success = [xmlParser parse];
if (success) {
return [NSDictionary dictionaryWithDictionary:intuitParser.resultDict];
} else {
NSLog(@"Error parsing login information");
return nil;
}
}
#pragma mark - NSXMLParserDelegate
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"Report"]) {
if (!self.resultDict) {
self.resultDict = [NSMutableDictionary dictionary];
}
return;
}
}
- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (!self.currentElementValue) {
self.currentElementValue = [[NSMutableString alloc] initWithString:string];
} else {
[self.currentElementValue appendString:string];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"DataRow"]) {
self.dataColNumber = 0;
}
if ([elementName isEqualToString:@"ColData"]) {
NSString *trimmedValue = [self.currentElementValue stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if (self.dataColNumber == 0) {
self.dataKey = trimmedValue;
self.dataColNumber++;
} else {
[self.resultDict setObject:trimmedValue forKey:self.dataKey];
}
}
self.currentElementValue = nil;
}
@end
結果の辞書を NSLog で出力しただけです(View ControllerのviewDidLoadでも...)。結果は次のとおりです。
2012-11-07 00:21:22.409 ETParseIntuitSOExample[66941:c07] {
"Accounts Payable" = 653653;
"Accounts Receivable" = 674532;
"Checking/Savings" = 12345345;
Equity = 45363;
"Fixed Assets" = 63545534;
"Long Term Liabilities" = "553797.26";
"Other Assets" = 325465;
"Other Current Assets" = 423546;
"Other Current Liabilities" = "910596.75";
}
XML 構造からの列ヘッダー情報が必要かどうかはわかりませんが、簡単に追加できるはずです。