1

次のようなWebサービスからのXML応答をマップするために、 RestKit0.20 -pre3をRKXMLReaderSerializationおよびXMLReaderと一緒に使用しようとしています。

<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>

アプリ委任コードの場合:

[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))

オブジェクトの結果は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の値を取得できるようにするために、値を正しくマップするにはどうすればよいですか?

4

2 に答える 2

2

リチャードからのフィードバックに感謝しますが、私が望むようには機能しませんでした。本当に簡単:ソースオブジェクトでネストされたキーパスを使用してマップし、魅力として機能しました:

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"}];
于 2012-12-14T00:16:23.653 に答える
0

要素の子ノードを独自のオブジェクトとしてマップします。したがって、たとえばOUは、それ自体のマッピングと関係によって表されます。

RKObjectMapping *baseValueMapping = [RKObjectMapping mappingForClass:[CHRValue class]];
[baseValueMapping addAttributeMappingsFromDictionary:@{@"text" : @"value"}];

RKRelationshipMapping *ouRelation = [RKRelationshipMapping relationshipMappingFromKeyPath:@"OU" toKeyPath:@"ou" withMapping:baseValueMapping];

RKRelationshipMapping *nameRelation = [RKRelationshipMapping relationshipMappingFromKeyPath:@"Name" toKeyPath:@"name" withMapping:baseValueMapping];

[addressBookMapping addPropertyMapping:ouRelation];
[addressBookMapping addPropertyMapping:nameRelation];

ここで、CHRValueには、NSStringである「value」という名前のプロパティがあります。ノードの値を参照するには、「テキスト」を使用する必要があることに注意してください。

于 2012-12-12T21:29:14.527 に答える