0

応答 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はまだ nil です。

xml でリソースの配列を取得するにはどうすればよいですか?
---更新済み-----
コードを更新しました。

RKObjectMapping *objMapping = [RKObjectMapping mappingForClass:[Field class]];
objMapping.forceCollectionMapping = YES;
[objMapping addAttributeMappingsFromDictionary:@{@"name":@"name.text"}];  

また、respondscripter をキーパスで更新します。

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の属性がマップソースオブジェクトの値になるようです。この種のオブジェクトを解析するように構成を設定するにはどうすればよいですか?

4

1 に答える 1

1

ラッパー オブジェクトを使用するResources場合 (必要はありません)、応答記述子が受信データに深く入り込みすぎているため、キー パスはlist. トレース ロギングをオンにすると、XML がどのようにデコードされているか、どのキーを使用する必要があるかを確認するのに役立ちます。私は XML をあまり使用しないので、XML をキーに直接マッピングするのは非常に困難です。

また、XML デコードでは通常、見つかったすべてのコンテンツがtextキーに追加されるため、キーとして使用するのではなく、使用nameする必要があることに注意しname.textてください (したがって、ソース キー パスと宛先キーを指定するための辞書が必要になります)。

于 2014-05-13T19:16:02.043 に答える