2013-07-21 17 views
0

我正在使用RKXMLReaderSerialization並試圖將來自服務器的XML響應映射到對象。它成功了,但映射結果中的對象只有空值。映射XML成功,但對象具有空值

這裏是我想從我的服務器映射文本/ XML響應:

<Provision version="1.0"> 
    <FileInfoWrapper> 
    <FileUrl>SomeFile.zip</FileUrl> 
    <FileName>SomeFile.zip</FileName> 
    <FileSha1>oi7NK/rFLL6dXqcu7ahaNfKsGkE=</FileSha1> 
    <FileSize>52220448</FileSize> 
    <Version>13</Version> 
    <Vital>true</Vital> 
    </FileInfoWrapper> 
</Provision> 

這裏是我的模型對象:

@interface FileInfoWrapper : NSObject 

@property NSString *fileUrl; 
@property NSString *fileName; 
@property NSString *fileSha1; 
@property long fileSize; 
@property NSString *version; 
@property BOOL vital; 

@end 

我加RKXMLReaderSerialization:

[RKMIMETypeSerialization registerClass:[RKXMLReaderSerialization class] forMIMEType:RKMIMETypeTextXML]; 
[[self objectManager] setAcceptHeaderWithMIMEType:@"application/json,text/xml"]; 

我想我已經正確設置了映射和響應描述符:

RKObjectMapping *fileInfoMapping = [RKObjectMapping mappingForClass:[FileInfoWrapper class]]; 
[fileInfoMapping addAttributeMappingsFromDictionary:@{ 
@"FileUrl":  @"fileUrl", 
@"FileName":  @"fileName", 
@"FileSha1":  @"fileSha1", 
@"FileSize":  @"fileSize", 
@"Version":  @"version", 
@"Vital":   @"vital"}]; 
RKResponseDescriptor *fileInfoResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:fileInfoMapping 
                           method:RKRequestMethodGET 
                          pathPattern:nil 
                           keyPath:@"Provision.FileInfoWrapper" 
                          statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[[self objectManager] addResponseDescriptor:fileInfoResponseDescriptor]; 

但是,當我打電話:

[[self objectManager] getObjectsAtPath:@"static/download/Installer.info.xml" 
          parameters:nil 
           success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
            NSLog(@"****Success!****"); 
            NSLog(@"mappingResult: %@", mappingResult); 
            FileInfoWrapper *fileInfo = [mappingResult firstObject]; 
            NSLog(@"URL: %@", [fileInfo fileUrl]); 
            NSLog(@"Name: %@", [fileInfo fileName]); 
            NSLog(@"SHA1: %@", [fileInfo fileSha1]); 
            NSLog(@"Size: %lx", [fileInfo fileSize]); 
           } 
           failure:^(RKObjectRequestOperation *operation, NSError *error) { 
            NSLog(@"****Failure!****"); 
           }]; 

的所有值均爲零:

I restkit.network:RKObjectRequestOperation.m:180 GET 'http://example.com/static/download/Installer.info.xml' 
I restkit.network:RKObjectRequestOperation.m:250 GET 'http://example.com/static/download/Installer.info.xml' (200 OK/1 objects) [request=0.1080s mapping=0.0060s total=0.1226s] 
****Success!**** 
mappingResult: <RKMappingResult: 0x10064b190, results={ 
    "Provision.FileInfoWrapper" = "<FileInfoWrapper: 0x10065f780>"; 
}> 
URL: (null) 
Name: (null) 
SHA1: (null) 
Size: 0 

我在做什麼錯?

更新:我打開RestKit/ObjectMapping記錄並得到了一些額外的信息:

D restkit.object_mapping:RKMapperOperation.m:377 Executing mapping operation for representation: { 
    Provision =  { 
     FileInfoWrapper =   { 
      FileName =    { 
       text = "SomeFile.zip"; 
      }; 
      FileSha1 =    { 
       text = "oi7NK/rFLL6dXqcu7ahaNfKsGkE="; 
      }; 
      … 
} 
and targetObject: (null) 
T restkit.object_mapping:RKMapperOperation.m:320 Examining keyPath 'Provision.FileInfoWrapper' for mappable content... 
D restkit.object_mapping:RKMapperOperation.m:300 Found mappable data at keyPath 'Provision.FileInfoWrapper': { 
    FileName =  { 
     text = "SomeFile.zip"; 
    }; 
    FileSha1 =  { 
     text = "oi7NK/rFLL6dXqcu7ahaNfKsGkE="; 
    }; 
    … 
} 
D restkit.object_mapping:RKMapperOperation.m:231 Asked to map source object { 
    FileName =  { 
     text = "SomeFile.zip"; 
    }; 
    FileSha1 =  { 
     text = "oi7NK/rFLL6dXqcu7ahaNfKsGkE="; 
    }; 
    … 
} with mapping <RKObjectMapping:0x10025e6b0 objectClass=FileInfoWrapper propertyMappings=(
    "<RKAttributeMapping: 0x10025ebc0 FileSha1 => fileSha1>", 
    "<RKAttributeMapping: 0x10025ed90 FileName => fileName>" 
    … 
)> 
D restkit.object_mapping:RKMappingOperation.m:952 Starting mapping operation... 
T restkit.object_mapping:RKMappingOperation.m:953 Performing mapping operation: <RKMappingOperation 0x10068f730> for 'FileInfoWrapper' object. Mapping values from object { 
    FileName =  { 
     text = "SomeFile.zip"; 
    }; 
    FileSha1 =  { 
     text = "oi7NK/rFLL6dXqcu7ahaNfKsGkE="; 
    }; 
    … 
} to object <FileInfoWrapper: 0x10068f290> with object mapping (null) 
T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'FileUrl' to 'fileUrl' 
T restkit.object_mapping:RKMappingOperation.m:431 Found transformable value at keyPath 'FileUrl'. Transforming from type '__NSDictionaryM' to 'NSString' 
D restkit.object_mapping:RKPropertyInspector.m:130 Cached property inspection for Class 'FileInfoWrapper': { 
    fileName =  { 
     isPrimitive = 0; 
     keyValueCodingClass = NSString; 
     name = fileName; 
    }; 
    fileSha1 =  { 
     isPrimitive = 0; 
     keyValueCodingClass = NSString; 
     name = fileSha1; 
    }; 
    … 
} 
T restkit.object_mapping:RKMappingOperation.m:583 Skipped mapping of attribute value from keyPath 'FileUrl to keyPath 'fileUrl' -- value is unchanged ((null)) 
T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'FileSha1' to 'fileSha1' 
T restkit.object_mapping:RKMappingOperation.m:431 Found transformable value at keyPath 'FileSha1'. Transforming from type '__NSDictionaryM' to 'NSString' 
T restkit.object_mapping:RKMappingOperation.m:583 Skipped mapping of attribute value from keyPath 'FileSha1 to keyPath 'fileSha1' -- value is unchanged ((null)) 
… 

回答

3

看來您必須從文本節點進行映射。這個帖子有同樣的問題:

RestKit 0.20-pre3 with RKXMLReaderSerialization and XMLReader

改變映射:

[fileInfoMapping addAttributeMappingsFromDictionary:@{ 
@"FileUrl.text":  @"fileUrl", 
@"FileName.text":  @"fileName", 
@"FileSha1.text":  @"fileSha1", 
@"FileSize.text":  @"fileSize", 
@"Version.text":  @"version", 
@"Vital.text":   @"vital",}]; 

做到了。

+0

哇!那是我遇到的問題。我無法想象這隻能看XML。謝謝! – Pauls

2

如果你希望你的XML不應該接受頭設置爲JSON。我也不認爲你可以像這樣設置一個逗號分隔的列表(儘管如此,不是100%確定的)。如果服務器通過接受頭文件發送JSON,那麼RestKit會對響應感到滿意,但可能無法真正做出任何映射(這看起來就是您所看到的)。

打開跟蹤記錄,以獲得更多的信息有關的響應和映射:

RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace); 

你映射代碼看起來是正確的。

+0

因爲我有其他的路徑產生JSON,所以我在接受頭文件中保存了JSON。我需要接受兩者。我打開了日誌記錄,並在帖子中添加了更多信息。謝謝! – Jonukas

+0

因此,您需要從跟蹤日誌記錄中獲取更多信息以瞭解發生了什麼。 – Wain