気楽なソフト工房

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



mykonos2008

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

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
XMLからオブジェクトのデシリアライズをするiOS用のライブラリ「ChimeraXML(キメラXML)」をgithubに公開しました。
iOSのXMLデシリアライズライブラリ「ChimeraXML」

さて、前回の記事の続きですが、本稿では、Javaのアノテーションや、C#のアトリビュートのように
Objective-cのプロパティにXMLの要素名をメタ情報として、付与する方法を紹介します。

といってもObjective-cには、アノテーションの仕組みはありませんので、クラスメソッドを定義し、そのメソッドで
メタ情報を返す仕組みを考えてみました。

まず、プロパティのメタ情報を保持するクラスとして、PropertyInfoクラスを定義しました。

「PropertyInfo.h」
@interface PropertyInfo : NSObject

@property(strong,nonatomic) NSString *name;
@property(strong,nonatomic) Class type;

@end

プロパティ名と型を持つようにしました。
型はデシリアライズ処理をする際に必要になります。

次に、デシリアライズ先となるクラスの共通の親クラスとなる「XmlEntity」クラスを定義します。

「XmlEntityu.h」
@interface XmlEntity : NSObject

+(PropertyInfo *)propertyInfoForElement:(NSString *)element;

@end

要素名に対応するプロパティの情報を返すクラスメソッドを定義しています。

実装ファイルは以下になります。

「XmlEntityu.m」
@implementation XmlEntity

+(PropertyInfo *)propertyInfoForElement:(NSString *)element
{
    return nil;
}

@end

子クラスでそれぞれの要素名に対応するプロパティ情報を返すように実装するのでここでは、ただ、nilを返すようにしています。

そして、このクラスをデシリアライズ先となるUserクラスにXMLEntityクラスを継承させます。
その前に今回解析する対象のXMLを以下のように少し変更します。

前回のXMLでは、要素名とプロパティ名が完全一致するようにしていましたが、
今回は、一致しないようにしました。

<User>
  <Id>1</Id>
  <Name>山田太郎</Name>
  <Email>xxxxx@xxxx.com</Email>
</User>

Userクラスは以下のようになります。

「User.h」

@interface User : XmlEntity

@property(strong,nonatomic) NSString *userId;
@property(strong,nonatomic) NSString *name;
@property(strong,nonatomic) NSString *email;

@end

「User.m」
@implementation User

+(PropertyInfo *)propertyInfoForElement:(NSString *)element
{
    static NSDictionary *_propDic;
    
    if(!_propDic){
        
        PropertyInfo *userId = [[PropertyInfo alloc] init];
        userId.name = @"userId";
        userId.type = [NSString class];
        
        PropertyInfo *name = [[PropertyInfo alloc] init];
        name.name = @"name";
        name.type = [NSString class];
        
        PropertyInfo *email = [[PropertyInfo alloc] init];
        email.name = @"email";
        email.type = [NSString class];
        
        _propDic = @{
                     @"Id": userId,
                     @"Name": name,
                     @"Email" :email
                     };
    }
    
    return _propDic[element];
}
@end

「XMLEntity」クラスで定義された「propertyInfoForElement:element:」メソッドをオーバーライドし、
要素名に対応するUserクラスのプロパティ情報を返却するようにしました。

PropertyInfoのtypeは動的に取得することも可能ですが、ここでは一旦、手動で設定しています。

さて、これで、ようやく準備が整いましたので、次回は、デシリアライズする部分を紹介します。


コメント

コメントの投稿

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

トラックバック

http://csfun.blog49.fc2.com/tb.php/115-e4afba82

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。