ios - 带有 RKXMLReaderSerialization 和 XMLReader 的 RestKit 0.20-pre3

标签 ios xcode restkit

我正在尝试将 RestKit 0.20-pre3RKXMLReaderSerializationXMLReader 一起使用,以便映射来自 WebService 的 XML 响应,例如这个:

<ArrayOfAddressBookItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
<AddressBookItem>
<CommonName>xxxxxxxxxx</CommonName>
<OU>xxxxxx</OU>
<Name>xxxxxx</Name>
<LastName>xxxxxxxxxx</LastName>
<Service>xxxxxxxxxx</Service>
<Email>xxxxxxxxxxxx</Email>
<InternalPhoneNumber>xxxxxxxxxxx</InternalPhoneNumber>
<ExternalPhoneNumber>xxxxxxxxxxx</ExternalPhoneNumber>
<Mobile>xxxxxxxxxxx</Mobile>
<Street>xxxxxxxxxxx</Street>
<PostalCode>xxxxxxxxxxx</PostalCode>
<City>xxxxxxx</City>
<County>xxxxxxxxx</County>
<SupervisorCommonName>
xxxxxxxxxxxxx
</SupervisorCommonName>
<SupervisorLastName>xxxxxxxxxx</SupervisorLastName>
</AddressBookItem>
<AddressBookItem>
<CommonName>yyyyyyyyyyyy</CommonName>
<OU>
yyyyyyyyyyyyy
</OU>
<Name>yyyyyyyyy</Name>
<LastName>yyyyyyyy</LastName>
<Service>yyyyyyyyyy</Service>
<Email>yyyyyyyyyy</Email>
<InternalPhoneNumber>yyyyyyyyy</InternalPhoneNumber>
<ExternalPhoneNumber>yyyyyyyy</ExternalPhoneNumber>
<Street>yyyyyyyyyyy</Street>
<PostalCode>yyyyyy</PostalCode>
<City>yyyyyy</City>
<County>yyyyyyyy</County>
<SupervisorCommonName>
yyyyyyyyyyy
</SupervisorCommonName>
<SupervisorLastName>yyyyyy</SupervisorLastName>
</AddressBookItem>
<AddressBookItem>
....
</AddressBookItem>
<AddressBookItem>
</ArrayOfAddressBookItem>

在应用委托(delegate)代码中:

[RKMIMETypeSerialization registerClass:[RKXMLReaderSerialization class] forMIMEType:@"application/xml"];
AFHTTPClient *httpClient = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://thehostaddress/mywebserviceurl/"]];
httpClient.parameterEncoding = AFFormURLParameterEncoding;
RKObjectManager *objManager = [[RKObjectManager alloc] initWithHTTPClient:httpClient];

[objManager setAcceptHeaderWithMIMEType:RKMIMETypeTextXML];
objManager.requestSerializationMIMEType = RKMIMETypeTextXML;

RKObjectMapping *personMapping = [RKObjectMapping mappingForClass:[PersonItem class]];
[personMapping addAttributeMappingsFromDictionary:@{@"CommonName" : @"commonName", @"OU" : @"ou", @"Name" : @"name", @"LastName" : @"lastName", @"Service" : @"service", @"Email" : @"eMail", @"InternalPhoneNumber" : @"internalPhoneNumber", @"ExternalPhoneNumber" : @"externalPhoneNumber", @"Mobile" : @"mobilePhoneNumber", @"Street" : @"street", @"PostalCode" : @"postalCode", @"City" : @"city", @"County" : @"county", @"SupervisorCommonName" : @"supervisorCommonName", @"SupervisorLastName" : @"supervisorLastName"}];

RKResponseDescriptor *peopleResponse = [RKResponseDescriptor responseDescriptorWithMapping:personMapping pathPattern:@"/mywebserviceurl/" keyPath:@"ArrayOfAddressBookItem" statusCodes:[NSIndexSet indexSetWithIndex:200]];

[objManager addResponseDescriptor:peopleResponse];

稍后,当我想要获取对象时:

[objManager getObjectsAtPath:@"/mywebserviceurl/" parameters:nil
                     success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                     NSLog(@"SUCCESS: %@", mappingResult);
                     _items = [[mappingResult array] mutableCopy];
                 }
                 failure:^(RKObjectRequestOperation *operation, NSError *error) {
                     NSLog(@"ERROR: %@", error);
                 }];

我可以看到映射器获得了正确数量的数组元素,但是对于对象的每个字段,我无法检索值:

2012-12-10 19:02:53.370 GenPeople2[14240:1703] T restkit.object_mapping:RKMappingOperation.m:341 Mapping attribute value keyPath 'CommonName' to 'commonName' 
2012-12-10 19:02:53.370 GenPeople2[14240:1703] T restkit.object_mapping:RKMappingOperation.m:228 Found transformable value at keyPath 'CommonName'. Transforming from type '__NSDictionaryM' to 'NSString' 
2012-12-10 19:02:53.371 GenPeople2[14240:1703] T restkit.object_mapping:RKMappingOperation.m:360 Skipped mapping of attribute value from keyPath 'CommonName to keyPath 'commonName' -- value is unchanged ((null))

我的对象中的结果是空值。

我看到 XML 解析器返回给我:

2012-12-10 19:02:53.371 GenPeople2[14240:1703] D restkit.object_mapping:RKMapperOperation.m:218 Asked to map source
 object {
     City =     {
         text = thecity;
     };
     CommonName =     {
         text = thename;
     };
     County =     {
         text = thecounty;
     }; 

等等....

如何正确映射值以允许 RestKit 检索 NSDictionary 中每个字段的值?

最佳答案

感谢 Richard 的反馈,但它没有达到我想要的效果。 真的很简单:在源对象中使用嵌套的键路径进行映射,起到了很好的作用:

RKObjectMapping *abItemMapping = [RKObjectMapping mappingForClass:[AddressBookItem class]];
[abItemMapping addAttributeMappingsFromDictionary:@{@"CommonName.text" : @"commonName", @"OU.text" : @"ou", @"Name.text" : @"name", @"LastName.text" : @"lastName", @"Service.text" : @"service", @"Email.text" : @"email"}];

关于ios - 带有 RKXMLReaderSerialization 和 XMLReader 的 RestKit 0.20-pre3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13819929/

相关文章:

android - 动画中的英雄和showDialog动画

c - 推荐学习C

iphone - Restkit 的链接器错误,找不到 Restkit.framework

c++ - 在 BST 中插入节点时出现 EXC_BAD_ACCESS (EXC_i386_GPFLT)

ios - 在 Xcode 中为目标添加通用和特定的可本地化文件

iphone - 如何从 Restkit + iOS 发布到 Rails

ios - 由于 json 问题,Restkit 在 iOS 8 中崩溃?

ios - 如何使用 Photos Framework 仅获取相机胶卷中的图像

ios - 类簇的适当子类化

iphone - MKMapView 无法按位置设置居中