数据解析总结

数据解析20161213

 

XML解析:

1、两层基础解析,对象里有对象

xml结构

Result

/Result

 

Message

/Message

 

loginmsg

 

<soufunid>

<soufunName>

<RealName>

/loginmsg

 

 头文件:

@class SHDetailDataModel;

@interface SHRegisterDesignerModel : NSObject

@property(nonatomic,strong)NSString * Result;

@property(nonatomic,strong)NSString * Mesage;

@property(nonatomic,strong)SHDetailDataModel * detailDataModel;

 

+(id)praseSHRegisterDesignerModel:(NSString *)str;

@end

 

@interface SHDetailDataModel : NSObject

@property(nonatomic,strong)NSString *soufunid;

@property(nonatomic,strong)NSString *soufunName;

@property(nonatomic,strong)NSString *RealName;

@property(nonatomic,strong)NSString *CityName;

@property(nonatomic,strong)NSString *Email;

@property(nonatomic,strong)NSString *logo;

@property(nonatomic,strong)NSString *soufunmobile;

@property(nonatomic,strong)NSString *CompanyName;

@property(nonatomic,strong)NSString *Type;

@end

实现:

 

@implementation SHRegisterDesignerModel

+(id)praseSHRegisterDesignerModel:(NSString *)str{

    NSMutableArray * nodes = [[NSMutableArray alloc] init];

//Root节点下的第一层数据  

  [nodes addObject:@"//Root”];

 

//loginmsg节点下的数据

    [nodes addObject:@"//Root//loginmsg”];

 

    NSMutableArray * modes = [[NSMutableArray alloc] init];

//Root节点下的第一层数据的model类  

  [modes addObject:@"SHRegisterDesignerModel"];

 

//loginmsg节点下的数据model的类

    [modes addObject:@"SHDetailDataModel"];

 

    //nodes和modes的关系是一一对应的

 

    id iret = [GDataParseXML utilitParseDataFromXML:str nodeArrary:nodes modeArrary:modes andOpption:NO];

    return iret;

}

@end

 

@implementation SHDetailDataModel

 

 

@end

 

 

解析具体实现方法:

+ (id)utilitParseDataFromXML:(NSString *)xmlString nodeArrary:(NSMutableArray*) nodes modeArrary:(NSMutableArray*) modes andOpption:(BOOL) isArray {

    NSError *error;

    GDataXMLDocumentAnother *doc = [[GDataXMLDocumentAnother alloc] initWithXMLString:xmlString options:0 error:&error];

    if (doc == nil) {

        return nil;

    }

    if ([nodes count] != [modes count]) {

        [doc release];

        return nil;

    }

    NSMutableArray * arrayForObjs = nil;

    if (isArray) {

        arrayForObjs = [[NSMutableArray alloc] init];

    }

    NSMutableArray *array = nil;

    NSMutableArray * propertyBase = [[NSMutableArray alloc] init];

    NSMutableDictionary *propertyDicBase =[[NSMutableDictionary alloc] init];

    

    id baseObj = [[NSClassFromString([modes objectAtIndex:0]) alloc] init];

    [GDataParseXML propertyMutableArray:propertyBase obj:baseObj];

    [GDataParseXML propertyDictionary:propertyDicBase obj:baseObj];

    

    int index =0;

    for (int i = 0;i< [nodes count] ;i++) {

        id obj = nil;

        NSMutableArray * propertyNames =nil;

        NSMutableDictionary *propertyDic =nil;

        if (i!= 0) {

            for (NSString* keystr in propertyBase) {

                if((index == [propertyBase indexOfObject:keystr]) && [[propertyDicBase objectForKey:keystr] isEqualToString:@"NSMutableArray"]){

                    array = [[NSMutableArray alloc] init];

                }

                

            }

            if (array == nil) {

                propertyNames = [[NSMutableArray alloc] init];

                propertyDic =[[NSMutableDictionary alloc] init];

                obj = [[NSClassFromString([modes objectAtIndex:i]) alloc] init];

                [GDataParseXML propertyMutableArray:propertyNames obj:obj];

                [GDataParseXML propertyDictionary:propertyDic obj:obj];

                

            }

        }

        NSArray *base = [doc nodesForXPath:[nodes objectAtIndex:i] error:nil];

        if (![base count]) {

            [array release];

            [obj release];

            obj = nil;

            array = nil;

        }

        

        for (GDataXMLNodeAnother *thisObeject in base){

            if (obj == nil && i!=0 && !isArray) {

                propertyNames = [[NSMutableArray alloc] init];

                propertyDic =[[NSMutableDictionary alloc] init];

                obj = [[NSClassFromString([modes objectAtIndex:i]) alloc] init];

                [GDataParseXML propertyMutableArray:propertyNames obj:obj];

                [GDataParseXML propertyDictionary:propertyDic obj:obj];

            }

            else if(baseObj == nil && isArray){

                baseObj = [[NSClassFromString([modes objectAtIndex:0]) alloc] init];

                [GDataParseXML propertyMutableArray:propertyBase obj:baseObj];

                [GDataParseXML propertyDictionary:propertyDicBase obj:baseObj];

                

            }

            for (GDataXMLNodeAnother * node in [(GDataXMLElementAnother *)thisObeject attributes]){

                if (i==0) {

                    for (NSString* keystr in propertyBase) {

                        //修改,修改此处的判断 id 等于 或等于ID大写

                        if (([[node localName] isEqualToString:keystr]||[[node localName]isEqualToString:[keystr lowercaseString]]) && [[propertyDicBase objectForKey:keystr] isEqualToString:@"NSString"]) {

                            [baseObj setValue:[node stringValue] forKey:keystr];

                            index++;

                        }

 

                    }

                    

                }

                else {

                    for (NSString* keystr in propertyNames) {

                        

                        if (([[node localName] isEqualToString:keystr]||[[node localName]isEqualToString:[keystr lowercaseString]]) && [[propertyDic objectForKey:keystr] isEqualToString:@"NSString"]) {

                            [obj setValue:[node stringValue] forKey:keystr];

                            

                        }

                        

                    }

                }

                

            }

            for (GDataXMLElementAnother *node in [thisObeject children]){

                NSString* temp = [[NSString alloc] initWithString:[node stringValue]];

                if (i==0) {

                    for (NSString* keystr in propertyBase) {

                        //修改  ID id的情况

                        if (([[node localName] isEqualToString:keystr]||[[node localName]isEqualToString:[keystr lowercaseString]]) && [[propertyDicBase objectForKey:keystr] isEqualToString:@"NSString"]) {

                            [baseObj setValue:temp forKey:keystr];

                            index++;

                        }

                    }

                    

                }

                else {

                    for (NSString* keystr in propertyNames) {

                        //修改

                        if (([[node localName] isEqualToString:keystr ] ||[[[node localName] lowercaseString]isEqualToString:[keystr lowercaseString]])&& [[propertyDic objectForKey:keystr] isEqualToString:@"NSString"]) {

                            [obj setValue:temp forKey:keystr];

                            

                        }

                        

                    }

                }

                [temp release];

            }

            if (array != nil) {

                [array addObject:obj];

                [obj release];

                obj = nil;

                [propertyNames release];

                [propertyDic release];

            }

            else if(array == nil && isArray){

                [arrayForObjs addObject:baseObj];

                [baseObj release];

                baseObj = nil;

                [propertyNames release];

                [propertyDic release];

            }

            

        }

        if (array == nil) {

            [propertyNames release];

            [propertyDic release];

        }

        if (i!=0 && !isArray) {

            index++;

        }

        //处理新加节点用这个实体却没有新加节点的情况

        if (i==0) {

            for (NSString* keystr in propertyBase) {

                if ([[propertyDicBase objectForKey:keystr] isEqualToString:@"NSString"]) {

                    if([baseObj valueForKey:keystr]==nil){

                        index++;

                    }

                }

            }

            

        }

        

        

        

        for (NSString* keystr in propertyBase) {

            if(((index-1) == [propertyBase indexOfObject:keystr]) && i!=0 && ![[propertyDicBase objectForKey:keystr] isEqualToString:@"NSString"]){

                if ([[propertyDicBase objectForKey:keystr] isEqualToString:@"NSMutableArray"]) {

                    [baseObj setValue:array forKey:keystr];

                    [array release];

                    array = nil;

                }

                else {

                    [baseObj setValue:obj forKey:keystr];

                }

            }

            else if(((index+1) == [propertyBase indexOfObject:keystr]) && i!=0 && ![[propertyDicBase objectForKey:keystr] isEqualToString:@"NSString"]){

                [baseObj setValue:obj forKey:keystr];

            }

            

        }

        [obj release];

        obj = nil;

        

    }

    [propertyBase release];

    [propertyDicBase release];

    [doc release];

    if (isArray) {

        if (baseObj!= nil) {

            [baseObj release];

        }

        

        return [arrayForObjs autorelease];

    }

    else{

        return [baseObj autorelease];

    }

    

}
2、两层数组解析,对象里有数组对象

基本同上,参考上面,将上层的model里面的属性改成执行类型model类的数组即可

对象里面有数组,xml的节点肯定会比上面多一层,数组的那一层,所以参考这个nodes,就会多一层,model还是各自对应的moel
+(id)parsePerformListModelWithXMLString:(NSString *)xmlString{

    NSMutableArray *nodes=[[NSMutableArray alloc]init];

    [nodes addObject:@"//root"];

    //数据模型内层数据节点

    [nodes addObject:@"//root//performance//performanceitem"];

    NSMutableArray *modes=[[NSMutableArray alloc]init];

    [modes addObject:@"PerformListModel"];

    [modes addObject:@"PerformanceItem"];

    id iret=[GDataParseXML utilitParseDataFromXML:xmlString nodeArrary:nodes modeArrary:modes andOpption:NO];

    //id iret = [GDataXMLUtil utilitParseDataFromXML:xmlString nodeArrary:nodes modeArrary:modes opption:NO];

    //GDataXMLUtil

    return iret;

}

 

 

 

3、三层数据解析:对象里套对象数组,套对象数组

 

解析具体实现方法:

 

+ (id)utilitParseDataFromXML3:(NSString *)xmlString nodeArrary:(NSMutableArray*) nodes modeArrary:(NSMutableArray*) modes andOpption:(BOOL) isArray {

    NSError *error;

    GDataXMLDocumentAnother *doc = [[GDataXMLDocumentAnother alloc] initWithXMLString:xmlString options:0 error:&error];

    if (doc == nil) {

        return nil;

    }

    if ([nodes count] != [modes count]) {

        [doc release];

        return nil;

    }

    NSMutableArray * arrayForObjs = nil;

    if (isArray) {

        arrayForObjs = [[NSMutableArray alloc] init];

    }

    NSMutableArray *array = nil;

    NSMutableArray * propertyBase = [[NSMutableArray alloc] init];

    NSMutableDictionary *propertyDicBase =[[NSMutableDictionary alloc] init];

    

    id baseObj = [[NSClassFromString([modes objectAtIndex:0]) alloc] init];

    [GDataParseXML propertyMutableArray:propertyBase obj:baseObj];

    [GDataParseXML propertyDictionary:propertyDicBase obj:baseObj];

    

    int index =0;

    for (int i = 0;i< [nodes count]-1 ;i++) {

        id obj = nil;

        NSMutableArray * propertyNames =nil;

        NSMutableDictionary *propertyDic =nil;

        if (i!= 0) {

            for (NSString* keystr in propertyBase) {

                if((index == [propertyBase indexOfObject:keystr]) && [[propertyDicBase objectForKey:keystr] isEqualToString:@"NSMutableArray"]){

                    array = [[NSMutableArray alloc] init];

                }

                

            }

            if (array == nil) {

                propertyNames = [[NSMutableArray alloc] init];

                propertyDic =[[NSMutableDictionary alloc] init];

                obj = [[NSClassFromString([modes objectAtIndex:i]) alloc] init];

                [GDataParseXML propertyMutableArray:propertyNames obj:obj];

                [GDataParseXML propertyDictionary:propertyDic obj:obj];

                

            }

        }

        NSArray *base = [doc nodesForXPath:[nodes objectAtIndex:i] error:nil];

        if (![base count]) {

            [array release];

            [obj release];

            obj = nil;

            array = nil;

        }

        

        for (GDataXMLNodeAnother *thisObeject in base){

            id iret = nil;

            if(i == 1){

                NSMutableArray * nodes2 = [[NSMutableArray alloc] init];

                [nodes2 addObject:[nodes objectAtIndex:2]];

                

                NSMutableArray * modes2 = [[NSMutableArray alloc] init];

                [modes2 addObject:[modes objectAtIndex:2]];

                

                iret = [GDataParseXML utilitParseDataFromXML:thisObeject.XMLString nodeArrary:nodes2 modeArrary:modes2 andOpption:YES];

                

                [nodes2 release];

                [modes2 release];

            }

            

            if (obj == nil && i!=0 && !isArray) {

                propertyNames = [[NSMutableArray alloc] init];

                propertyDic =[[NSMutableDictionary alloc] init];

                obj = [[NSClassFromString([modes objectAtIndex:i]) alloc] init];

                [GDataParseXML propertyMutableArray:propertyNames obj:obj];

                [GDataParseXML propertyDictionary:propertyDic obj:obj];

            }

            else if(baseObj == nil && isArray){

                baseObj = [[NSClassFromString([modes objectAtIndex:0]) alloc] init];

                [GDataParseXML propertyMutableArray:propertyBase obj:baseObj];

                [GDataParseXML propertyDictionary:propertyDicBase obj:baseObj];

                

            }

            for (GDataXMLNodeAnother * node in [(GDataXMLElementAnother *)thisObeject attributes]){

                if (i==0) {

                    for (NSString* keystr in propertyBase) {

                        if ([[node localName] isEqualToString:keystr] && [[propertyDicBase objectForKey:keystr] isEqualToString:@"NSString"]) {

                            [baseObj setValue:[node stringValue] forKey:keystr];

                            index++;

                        }

                    }

                    

                }

                else {

                    for (NSString* keystr in propertyNames) {

                        if ([[node localName] isEqualToString:keystr] && [[propertyDic objectForKey:keystr] isEqualToString:@"NSString"]) {

                            [obj setValue:[node stringValue] forKey:keystr];

                            

                        }

                        

                    }

                }

                

            }

            for (GDataXMLElementAnother *node in [thisObeject children]){

                NSString* temp = [[NSString alloc] initWithString:[node stringValue]];

                if (i==0) {

                    for (NSString* keystr in propertyBase) {

                        if ([[node localName] isEqualToString:keystr] && [[propertyDicBase objectForKey:keystr] isEqualToString:@"NSString"]) {

                            [baseObj setValue:temp forKey:keystr];

                            index++;

                        }

                    }

                    

                }

                else {

                    for (NSString* keystr in propertyNames) {

                        if ([[node localName] isEqualToString:keystr] && [[propertyDic objectForKey:keystr] isEqualToString:@"NSString"]) {

                            [obj setValue:temp forKey:keystr];

                            

                        }

                        

                        if ([[propertyDic objectForKey:keystr] isEqualToString:@"NSMutableArray"]) {

                            [obj setValue:iret forKey:keystr];

                            

                            

                            

                        }

 

                    }

                }

                [temp release];

            }

            if (array != nil) {

                

                [array addObject:obj];

                [obj release];

                obj = nil;

                [propertyNames release];

                [propertyDic release];

            }

            else if(array == nil && isArray){

                [arrayForObjs addObject:baseObj];

                [baseObj release];

                baseObj = nil;

                [propertyNames release];

                [propertyDic release];

            }

            if (iret != nil) {

                //[iret release];

            }

            

        }

        if (array == nil) {

            [propertyNames release];

            [propertyDic release];

        }

        if (i!=0 && !isArray) {

            index++;

        }

        //处理新加节点用这个实体却没有新加节点的情况

        if (i==0) {

            for (NSString* keystr in propertyBase) {

                if ([[propertyDicBase objectForKey:keystr] isEqualToString:@"NSString"]) {

                    if([baseObj valueForKey:keystr]==nil){

                        index++;

                    }

                }

            }

            

        }

        

       

        for (NSString* keystr in propertyBase) {

            if(((index-1) == [propertyBase indexOfObject:keystr]) && i!=0 && ![[propertyDicBase objectForKey:keystr] isEqualToString:@"NSString"]){

                if ([[propertyDicBase objectForKey:keystr] isEqualToString:@"NSMutableArray"]) {

                    [baseObj setValue:array forKey:keystr];

                    [array release];

                    array = nil;

                }

                else {

                    [baseObj setValue:obj forKey:keystr];

                }

            }

            else if(((index+1) == [propertyBase indexOfObject:keystr]) && i!=0 && ![[propertyDicBase objectForKey:keystr] isEqualToString:@"NSString"]){

                [baseObj setValue:obj forKey:keystr];

            }

            

        }

        [obj release];

        obj = nil;

        

    }

    [propertyBase release];

    [propertyDicBase release];

    [doc release];

    if (isArray) {

        if (baseObj!= nil) {

            [baseObj release];

        }

        

        return [arrayForObjs autorelease];

    }

    else{

        return [baseObj autorelease];

    }

    

}

 

 

json解析:

ESJsonFormat和Json model的配合使用自动生成model爽翻天

 

生成model示例:

 

@class ComplaintlistItem;

@interface AppealListModel : NSObject

 

@property (nonatomic, assign) NSInteger IsSuccess;

 

@property (nonatomic, assign) NSInteger RecordCount;

 

@property (nonatomic, copy) NSString *ErrorMessage;

 

@property (nonatomic, strong) NSArray<ComplaintlistItem *> *ComplaintList;

 

@end

@interface ComplaintlistItem : NSObject

 

@property (nonatomic, copy) NSString *OrderID;

 

@property (nonatomic, copy) NSString *YzName;

 

@property (nonatomic, copy) NSString *ComplaintStateName;

 

@property (nonatomic, assign) NSInteger ComplaintID;

 

@property (nonatomic, assign) NSInteger Frequency;

 

@property (nonatomic, copy) NSString *Content;

 

@property (nonatomic, assign) NSInteger ComplaintState;

 

@property (nonatomic, copy) NSString *CreateTime;

 

@end

 

实现:

 

@implementation AppealListModel

 

 

+ (NSDictionary *)objectClassInArray{

    return @{@"ComplaintList" : [ComplaintlistItem class]};

//上层的属性,和其对应的model类的一一对应字典,如果多层嵌套,在相应的上层类实现文件中这样指明解析对应关系即可

}

@end

@implementation ComplaintlistItem

 

@end

 

posted @ 2016-12-13 10:22  乔胖胖  阅读(187)  评论(0编辑  收藏  举报