2014-05-23 49 views
2

我试图使用RestKit(0.23.1)来解析一些原子XML:RestKit解析XML原子与阵列

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:ex="http://my.library.com">  
    <entry> 
     <title>Title 1</title> 
     <link href="http://localhost:2001/1" /> 
     <id>urn:uuid:a6e04980-e273-11e3-8b68-0800200c9a66</id> 
     <updated>2013-12-21T18:30:02Z</updated> 
     <summary>Summary 1</summary> 
     <ex:thing> 
      <ex:name>Thing 1</ex:name> 
     </ex:thing> 
     <ex:thing> 
      <ex:name>Thing 2</ex:name> 
     </ex:thing> 
    </entry> 
</feed> 

我使用的对象映射器来映射该进料分成两对象。第一个对象表示包含一系列事物的Feed中的条目。

@interface Entry : NSObject 

@property NSString *title; 
@property NSString *summary; 
@property NSMutableArray *things; 

@end 

NSMutableArray包含事物的集合。

@interface Thing : NSObject 

@property NSString *name; 

@end 

最后的RestKit代码胶水这一起是在这里:

- (void) parseAtomThings { 
    [RKMIMETypeSerialization registerClass:[RKXMLReaderSerialization class] forMIMEType:@"application/atom+xml"]; 

    RKObjectMapping *entryMapping = [RKObjectMapping mappingForClass:[Entry class]]; 
    [entryMapping addAttributeMappingsFromDictionary:@{ 
      @"title.text" : @"title", 
      @"summary.text" : @"summary" 
    }]; 

    RKObjectMapping *thingMapping = [RKObjectMapping mappingForClass:[Thing class]]; 
    [thingMapping addAttributeMappingsFromDictionary:@{ 
      @"name.text" : @"name" 
    }]; 

    // TODO - how do I get this to map to ex:thing? 
    [entryMapping addRelationshipMappingWithSourceKeyPath:@"thing" mapping:thingMapping]; 

    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:entryMapping method:RKRequestMethodGET pathPattern:nil 
                  keyPath:@"feed.entry" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:2001/library.xml"]]; 

    RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[responseDescriptor]]; 
    [operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *result) { 
     for(Entry *entry in [result array]) { 
      NSLog(@"%@", entry.description); 
     } 
    } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
     NSLog(@"Failed with error: %@", [error localizedDescription]); 
    }]; 
    [operation start]; 
} 

执行时,输入对象的标题和摘要属性被填充。但是,事物的NSMutableArray没有填充,并且为零。

我敢肯定,我在寻找神奇的是围绕这一行:

[entryMapping addRelationshipMappingWithSourceKeyPath:@"thing" mapping:thingMapping]; 

但我无法弄清楚如何正确指定地图的列表中的东西财产上的条目类。

的记录是在这里:

2014-05-23 23:06:05.457 TestApp[61282:3303] D restkit.object_mapping:RKMappingOperation.m:859 Starting mapping operation... 
2014-05-23 23:06:05.457 TestApp[61282:3303] T restkit.object_mapping:RKMappingOperation.m:860 Performing mapping operation: <RKMappingOperation 0xbe3b4b0> for 'Entry' object. Mapping values from object { 
    "ex:thing" =  (
       { 
      "ex:name" =    { 
       text = "Thing 1"; 
      }; 
      text = ""; 
     }, 
       { 
      "ex:name" =    { 
       text = "Thing 2"; 
      }; 
      text = ""; 
     } 
    ); 
    id =  { 
     text = "urn:uuid:a6e04980-e273-11e3-8b68-0800200c9a66"; 
    }; 
    link =  { 
     href = "http://localhost:2001/1"; 
     text = ""; 
    }; 
    summary =  { 
     text = "Summary 1"; 
    }; 
    text = ""; 
    title =  { 
     text = "Title 1"; 
    }; 
    updated =  { 
     text = "2013-12-21T18:30:02Z"; 
    }; 
} to object <Entry: 0xbe39e00> with object mapping (null) 
2014-05-23 23:06:05.458 TestApp[61282:3303] D restkit.object_mapping:RKMappingOperation.m:728 Did not find mappable relationship value keyPath 'thing' 
2014-05-23 23:06:05.459 TestApp[61282:3303] T restkit.object_mapping:RKMappingOperation.m:438 Found transformable value at keyPath 'summary.text'. Transforming from class '__NSCFString' to 'NSString' 
2014-05-23 23:06:05.459 TestApp[61282:3303] T restkit.object_mapping:RKMappingOperation.m:453 Mapping attribute value keyPath 'summary.text' to 'summary' 
2014-05-23 23:06:05.459 TestApp[61282:3303] T restkit.object_mapping:RKMappingOperation.m:469 Mapped attribute value from keyPath 'summary.text' to 'summary'. Value: Summary 1 
2014-05-23 23:06:05.459 TestApp[61282:e03] D restkit.object_mapping:RKPropertyInspector.m:131 Cached property inspection for Class 'Entry': { 
    summary =  { 
     isPrimitive = 0; 
     keyValueCodingClass = NSString; 
     name = summary; 
    }; 
    things =  { 
     isPrimitive = 0; 
     keyValueCodingClass = NSMutableArray; 
     name = things; 
    }; 
    title =  { 
     isPrimitive = 0; 
     keyValueCodingClass = NSString; 
     name = title; 
    }; 
} 
2014-05-23 23:06:05.460 TestApp[61282:3303] T restkit.object_mapping:RKMappingOperation.m:438 Found transformable value at keyPath 'title.text'. Transforming from class '__NSCFString' to 'NSString' 
2014-05-23 23:06:05.460 TestApp[61282:3303] T restkit.object_mapping:RKMappingOperation.m:453 Mapping attribute value keyPath 'title.text' to 'title' 
2014-05-23 23:06:05.461 TestApp[61282:3303] T restkit.object_mapping:RKMappingOperation.m:469 Mapped attribute value from keyPath 'title.text' to 'title'. Value: Title 1 
2014-05-23 23:06:05.461 TestApp[61282:3303] D restkit.object_mapping:RKMappingOperation.m:928 Finished mapping operation successfully... 
2014-05-23 23:06:05.461 TestApp[61282:3303] D restkit.object_mapping:RKMapperOperation.m:403 Finished performing object mapping. Results: { 
    "feed.entry" = "<Entry: 0xbe39e00>"; 
} 

日志记录中明确指出:

014-05-23 23:06:05.458 TestApp[61282:3303] D restkit.object_mapping:RKMappingOperation.m:728 Did not find mappable relationship value keyPath 'thing' 

我猜我不能见树不见林,并错过了一些东西真的很明显。任何帮助深表感谢。

回答

1

您从关键路径中缺少ex:

为了迎合这一点,您需要创建关系映射并将其添加(与relationshipMappingFromKeyPath:toKeyPath:withMapping:),而不是使用便捷方法addRelationshipMappingWithSourceKeyPath:mapping:(因为源路径和目标路径不同)。

同样的问题延伸到您需要将@"name.text"更改为@"ex:name.text"的名称。

+0

感谢您的指针,它现在工作完美。正如你建议我换成addRelationshipMappingWithSourceKeyPath这个: 'RKRelationshipMapping * relationshipMapping = [RKRelationshipMapping relationshipMappingFromKeyPath:@ “恩:事” toKeyPath:@ “东西” withMapping:thingMapping]'' [entryMapping addPropertyMapping:relationshipMapping]' – biddster