Restkit:与 xml 的对象映射

Posted

技术标签:

【中文标题】Restkit:与 xml 的对象映射【英文标题】:Restkit: object mapping with xml 【发布时间】:2014-05-13 15:13:34 【问题描述】:

我尝试将响应 xml 映射到对象中,xml 看起来像:


&ltlist version="1.0"&gt
  &ltmeta>
    &lttype>resource-list&lt/type>
  &lt/meta>
  &ltresources start="0" count="168">
    &ltresource classname="Quote">
      &ltfield name="name">Alpha&lt/field>
      &ltfield name="price">10&lt/field>
    &lt/resource>
    &ltresource classname="Quote">
      &ltfield name="name">Beta&lt/field>
      &ltfield name="price">9&lt/field>
    &lt/resource>
  &lt/resources>
&lt/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 的对象映射的主要内容,如果未能解决你的问题,请参考以下文章

RESTKit 的问题,无法正确映射

具有相同元素和属性名称的 RestKit XML 映射

RestKit 从本地存储的 XML 解析/对象映射

Restkit Kit XML 映射对象返回 null

使用自省restkit的对象映射

RestKit:创建一个对象而不保存它