學習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>