Restkit:与 xml 的对象映射
Posted
技术标签:
【中文标题】Restkit:与 xml 的对象映射【英文标题】:Restkit: object mapping with xml 【发布时间】:2014-05-13 15:13:34 【问题描述】:我尝试将响应 xml 映射到对象中,xml 看起来像:
<list version="1.0">
<meta>
<type>resource-list</type>
</meta>
<resources start="0" count="168">
<resource classname="Quote">
<field name="name">Alpha</field>
<field name="price">10</field>
</resource>
<resource classname="Quote">
<field name="name">Beta</field>
<field name="price">9</field>
</resource>
</resources>
</list>
我想要的是resources
部分。我创建对象模型:
@interface Field : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSNumber *price;
@end
@interface Resources : NSObject
@property (nonatomic, strong) NSNumber *count;
@property (nonatomic, strong) NSArray *resource;
@end
问题是:我不知道如何设置resource
的映射Resources
。我曾经尝试过使用映射:
RKObjectMapping *objMapping = [RKObjectMapping mappingForClass:[Field class]];
[objMapping addAttributeMappingsFromArray:@[@"name",@"price"]];</br>
RKObjectMapping *resourcesMapping = [RKObjectMapping mappingForClass:[Resources class]];
[resourcesMapping addAttributeMappingsFromArray:@[@"count"]];
[resourcesMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"resource" toKeyPath:nil withMapping:objMapping]];
RKResponseDescriptor *descriptor = [RKResponseDescriptor responseDescriptorWithMapping:resourcesMapping method:RKRequestMethodGET pathPattern:@"XXXXXX" keyPath:@"list.resources" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
映射完成后,Resources
对象被创建。但是它的数组resource
仍然为零。
如何获取 xml 中的资源数组? ---更新----- 我更新了代码,就是
RKObjectMapping *objMapping = [RKObjectMapping mappingForClass:[Field class]];
objMapping.forceCollectionMapping = YES;
[objMapping addAttributeMappingsFromDictionary:@@"name":@"name.text"];
我还使用 keypath 更新响应脚本:
RKResponseDescriptor *descriptor = [RKResponseDescriptor responseDescriptorWithMapping:objMapping method:RKRequestMethodGET pathPattern:@"XXXXX" keyPath:@"list.resources.resource.field" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
那么在RKObjectManager
的成功块中,映射结果有字段数组。问题是Field
的属性都是nil
。
我检查了看起来的日志:
D restkit.object_mapping:RKMapperOperation.m:229 Asked to map source object (
name = name;
text = "alpha";
,
name = price;
text = "98.3";
) with mapping name.text>"
)>
2014-05-14 23:33:57.681 RestKitTest[5138:3307] D restkit.object_mapping:RKMappingOperation.m:859 Starting mapping operation...
2014-05-14 23:33:57.682 RestKitTest[5138:3307] W restkit.object_mapping:RKMappingOperation.m:338 Destination object rejected attribute value (
name,
price
) for keyPath name.text. Skipping...
好像xml的属性变成了地图源对象的值。我如何设置配置来解析这种对象?
【问题讨论】:
【参考方案1】:如果您想使用Resources
包装器对象(您不需要),那么您的响应描述符对传入数据的钻探太深,关键路径应该只是list
。打开跟踪日志将帮助您查看 XML 的解码方式以及您应该使用哪些键。我不经常使用 XML,并且发现直接将 XML 映射到键非常困难。
另请注意,XML 解码通常会将所有找到的内容添加到 text
键中,因此您需要使用 name.text
而不是使用 name
作为键(因此您需要一个字典来指定源密钥路径和目标密钥)。
【讨论】:
我更新代码以添加 RKLog。我得到了地图源对象,但未能创建映射。你能看一下吗? 你没有按照我的指示 - 'list.resources.resource.field' 的关键路径来自哪里?此外,查看您的 XML 可能是不可能的,因为所有内容都是field
标记。这意味着您可能需要处理字段字典数组并自己编写代码来提取内容,这不是 RestKit 的一个很好的用途。
其实我不太明白为什么不能用list.resources,resource,field
。但是,正如您所指的,它是一个属性字典数组,我尝试在不映射 RestKit
的情况下解析它。以上是关于Restkit:与 xml 的对象映射的主要内容,如果未能解决你的问题,请参考以下文章