IOS 反射獲取屬性,序列化成xml


學習Object-C不足一個月。 寫的較簡單。支持復雜對象,目前對象中只支持NSSTRING類型和自定義類。

因為項目需要,調用service時候,一定要用xml作為數據,我Google了兩天,沒找到支持復雜對象的序列化。不知各位大牛有什么好的類庫實現了對象和xml的互轉?以前習慣在.net下有現成的,轉到Object-C下面,貌似好多要自己寫!各種糾結!

下面是我用Object-C實現的將對象轉為xml的方法。但是還沒研究出來如何將xml轉為對象的解決方案。忘高手指導一二。

ConvertObjToXml.h

//
//  ConvertObjToXml.h
////
//  Created by Elliott on 13-3-5.
//  Copyright (c) 2013年 Elliott. All rights reserved.
//

#import <Foundation/Foundation.h>
@interface ConvertObjToXml : NSObject

+(NSString *)Convert:(id)obj;

@end

ConvertObjToXml.m

//
//  ConvertObjToXml.m
//  WebServiceTest
//
//  Created by Elliott on 13-3-5.
//  Copyright (c) 2013年 Elliott. All rights reserved.
//
#import <objc/runtime.h>
#import "ConvertObjToXml.h"

@implementation ConvertObjToXml
+(NSString *)Convert:(id)obj
{
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList([obj class], &outCount);
    NSString *xml=[[NSString alloc]initWithFormat:@"<%@>",[obj class]];
    for(i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        NSString *key=[[NSString alloc]initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
        id value=[obj valueForKey:key];
        
        if (value!=nil) {
            //IF NOT NSSTRING,LOOP!!!!!!
            if (![value isKindOfClass:[NSString class]]) {
                //NSLog(@"子類:%@",[ConvertObjToXml Convert:[obj valueForKey:key]]);
                xml=[xml stringByAppendingFormat:@"%@",[ConvertObjToXml Convert:[obj valueForKey:key]]];
            }
            else
            {
                xml=[xml stringByAppendingFormat:@"<%@>%@</%@>",key,value,key];
            }
        }
        else
        {
            xml=[xml stringByAppendingFormat:@"<%@>%@</%@>",key,@"",key];
        }
    }
    xml=[xml stringByAppendingFormat:@"</%@>",[obj class]];
    
    //NSLog(@"結果:%@",xml);
    
    free(properties);
    
    return xml;
}
@end

調用方式:

NSString *xml= [ConvertObjToXml Convert:obj];
NSLog(@"Result:%@",xml);

 

案例:

首先定義了兩個類,一個UserInfo,一個companyinfo。UserInfo中包含companyinfo這個類。

USERINFO.h

//
//  USERINFO.h
// 
//
//  Created by Elliott on 13-3-5.
//  Copyright (c) 2013年 Elliott. All rights reserved.
//

#import <Foundation/Foundation.h>
@class CompanyInfo;
@interface USERINFO : NSObject
@property(nonatomic,strong) CompanyInfo *CompanyInfo;
@property(nonatomic,strong) NSString *USERID;
@property(nonatomic,strong) NSString *PASSWORD;
@property(nonatomic,strong) NSString *USERTYPE;

@end

USERINFO.m

//
//  USERINFO.m
// 
//
//  Created by Elliott on 13-3-5.
//  Copyright (c) 2013年 Elliott. All rights reserved.
//
#import <objc/runtime.h>
#import "USERINFO.h"
#import "ConvertObjToXml.h"
@implementation USERINFO

@end

CompanyInfo.h

//
//  CompanyInfo.h
// 
//
//  Created by Elliott on 13-3-5.
//  Copyright (c) 2013年 Elliott. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface CompanyInfo : NSObject

@property(nonatomic,strong) NSString *CompanyName;
@property(nonatomic,strong) NSString *CompanyCode;

@end

CompanyInfo.m

//
//  CompanyInfo.m
// 
//
//  Created by Elliott on 13-3-5.
//  Copyright (c) 2013年 Elliott. All rights reserved.
//

#import "CompanyInfo.h"

@implementation CompanyInfo

@end

調用:

USERINFO *user=[[USERINFO alloc] init];
user.USERID=@"aaa";
CompanyInfo *info=[[CompanyInfo alloc]init];
info.CompanyName=@"companyname";
info.CompanyCode=@"code";
user.CompanyInfo=info;
NSLog(@"%@",[ConvertObjToXml Convert:user]);

結果:

<USERINFO><CompanyInfo><CompanyName>companyname</CompanyName><CompanyCode>code</CompanyCode></CompanyInfo><USERID>aaa</USERID><PASSWORD></PASSWORD><USERTYPE></USERTYPE></USERINFO>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM