気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

今回はChimeraXMLで以下のようなXMLを解析する方法を説明します。

<image>
    <image-name>sun.jpg</image-name>
    <size>
        <width>250</width>
        <height>300</height>
    </size>
</image>

[image-name]要素については、前回のチュートリアルで解説したように、単純に対応するプロパティを定義し、
[propertyInfoForElement:]メソッドで、そのプロパティ名を返すようにしておけばよいです。

[size]要素下の[width]と[height]については、同じ方法ではうまくいきません。
[width]と[height]の親要素として、[size]要素が存在しているため、
imageエンティティには、[size]要素に対応するプロパティを定義する必要があります。

[size]要素に対応するプロパティには、CPXmlEntityクラスを継承する別のクラスを作成し、それを型として指定します。
まず、先にサイズ要素に対応するSizeEntityクラスを定義します。

[SizeEntity.h]
#import "CPXmlEntity.h"

@interface SizeEntity : CPXmlEntity

@property(strong,nonatomic) NSNumber *width;
@property(strong,nonatomic) NSNumber *height;

@end

[SizeEntity.m]
#import "SizeEntity.h"

@implementation SizeEntity

+ (id)propertyInfoForElement:(NSString *)element
{
    static NSDictionary *propDic;
    
    if(!propDic){
        
        propDic = @{
                    @"width": @"width",
                    @"height": @"height"
                    };
    }
    
    return propDic[element];
}

@end

そして、先に定義したSizeEntityを使用するImageEntityを定義します。

[ImageEntity.h]
#import "CPXmlEntity.h"
#import "SizeEntity.h"

@interface ImageEntity : CPXmlEntity

@property(strong,nonatomic) NSString *imageName;
@property(strong,nonatomic) SizeEntity *size;

@end

[ImageEntity.m]
#import "ImageEntity.h"

@implementation ImageEntity

+ (id)propertyInfoForElement:(NSString *)element
{
    static NSDictionary *propDic;
    
    if(!propDic){
        
        propDic = @{
                    @"image-name": @"imageName",
                    @"size": @"size"
                    };
    }
    
    return propDic[element];
}

@end


パース処理をする部分は特別な対応は必要はありません。

    
    NSData *data = [xmlText dataUsingEncoding:NSUTF8StringEncoding];
    ChimeraParser *chimeraParser = [[ChimeraParser alloc] initWithTargetClass:[ImageEntity class]];
    ImageEntity *image = [chimeraParser parse:data];
    NSLog(@"imageName = %@",image.imageName);
    NSLog(@"width = %@",image.size.width);
    NSLog(@"height = %@",image.size.height);

ChimeraXMLチュートリアル(1) シンプルなXMLを解析する
ChimeraXMLチュートリアル(2) エンティティ型のプロパティを定義する
ChimeraXML_チュートリアル(3) 配列型の要素を解析する

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/128-c633e1a7