トップ «前の日記(2012-03-03) 最新 次の日記(2012-03-05)» 編集

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|

2012-03-04 [iOS]イベント駆動のXMLプログラミング

XMLデータを操作するAPIに、DOM(Document Object Model)とSAX(Simple API for XML)があるが、これに対応するCocoaのクラスがNSXMLDocumentとNSXMLParserだ。ただし、iOSではNSXMLDocumentが利用できない。iOSでDOMを使用したい場合はlibxml2を利用する事になる。

XMLデータからエレメント名と値を取得する例は、以下のとおり。

ビュー・コントローラをNSXMLParserDelegateに対応させる。

@interface ViewController : UIViewController 
@property (strong, nonatomic) NSString  *elementName;
@end

指定されたURLのXMLデータを読み込み、エレメントとそれの値を見つけたらデバッグ出力する例だ。

@implementation ViewController
 
@synthesize elementName = _elementName;
 
- (void)viewDidLoad
{
    [super viewDidLoad];
     
    NSString    *requestString = [NSString stringWithString:@"http://www.kyuden.co.jp/power_usages/xml/electric_power_usage20120304.xml"];
    NSURL   *url = [NSURL URLWithString:requestString];
    [self parseXMLFile:url];
}
 
- (void)parseXMLFile:(NSURL *)url
{
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    [parser setDelegate:self];
    [parser parse];
}
 
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict
{
    if (elementName) {
        NSLog(@"element: %@", elementName);
        self.elementName = elementName;
    }
}
 
- (void)parser:(NSXMLParser *)parser
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName
{
    if (self.elementName) {
        self.elementName = nil;
    }
}
 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if ((self.elementName)
        && (![self.elementName isEqualToString:@""])
        && (string)) {
        NSLog(@"char: %@", string);
    }
}
@end

これ以上については著者も調査中なので、機会があれば次回で。

_ ソースコード

GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/ios/XMLParser - GitHub

_ 関連情報

Event-Driven XML Programming Guide
Apple Developerサイトの情報。

トップ «前の日記(2012-03-03) 最新 次の日記(2012-03-05)» 編集