iPhone では NSXMLDocument がシュミレータでは動作するが実機では動作しないそうなので、NSXMLParser を使用して解析してみました。

解析したのは下記のような XML です。

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user name="hoge" age="20" />
    <user name="fuga" age="30" />
</users>


実際に解析するコード

static NSString *feedURLString = @"http://www.syuhari.jp/test/test.xml";

- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    // 解析開始時に実行する処理
}

- (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error
{
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
    [parser setDelegate:self];
    [parser setShouldProcessNamespaces:NO];
    [parser setShouldReportNamespacePrefixes:NO];
    [parser setShouldResolveExternalEntities:NO];
    [parser parse];
    NSError *parseError = [parser parserError];
    if (parseError && error) {
        *error = parseError;
    }
    [parser release];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    // エレメント開始ハンドラ
    if (qName) {
        elementName = qName;
    }
    if ([elementName isEqualToString:@"user"]) {
        // 属性値を出力
        NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]);
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    // エレメント終了ハンドラ
    if (qName) {
        elementName = qName;
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    // エレメントの文字データを string で取得
}

NSError *parseError = nil;
[self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError];

実際に使用する際は解析する処理(最後の2行以外)をクラスにして、最後の2行をそのクラスに対して実行するのがいいかと思います。

関連する投稿