4

私は RESTKit の可能性を信じています。素晴らしいですね。

残念ながら、私が見つけることができたすべての例は、JSON の解析と、比較的「フラットな」JSON の解析を中心に展開しています。残念なことに、世の中には XML がたくさんあり、その多くは醜いものです。

特に、深くネストされた XML 構造を解析する良い例を見つけることができないようです。

私の失敗は主要なパスを理解することにあると思います。この質問への答えが、この問題に直面している他の人にとって標準的な例になることを願っています.

人為的な例で行きましょう。次の XML を検討してください。

<?xml version="1.0"?> 
<old_lady fate="perhaps she'll die!"> 
  <bird reason = "to catch the spider"> 
    <spider reason="to catch the fly"> 
      <fly reason="why oh why?" action="swallowed" name="Al"/> 
      <fly reason="why oh why?" action="swallowed" name="Bob"/> 
      <fly reason="why oh why?" action="swallowed" name="Cory"/> 
      <fly reason="why oh why?" action="swallowed" name="Dan"/> 
      <fly reason="why oh why?" action="swallowed" name="Edgar"/> 
    </spider> 
  </bird> 
</old_lady>

ここから Fly オブジェクトのリストを取得したいとしましょう:

@interface Fly : NSObject 
@property (retain) NSString *reason; 
@property (retain) NSString *action; 
@property (retain) NSString *name; 
@end 

だから私は次のようなことをするだろうと思っていました:

[RKObjectManager objectManagerWithBaseURL:[NSURL 
URLWithString:@"http://some.server.com"]];

RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Fly class]]; 
[mapping mapKeyPath:@"reason" toAttribute:@"reason"]; 
[mapping mapKeyPath:@"action" toAttribute:@"action"]; 
[mapping mapKeyPath:@"name" toAttribute:@"name"];

[RKObjectManager.sharedManager.mappingProvider setMapping:mapping
forKeyPath:@"//old_lady/bird/spider/fly"]; 

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/path/to/rhyme.xml" 
                                                  delegate:self]; 

しかし、これは私を得る:

Encountered errors during mapping: Could not find an object mapping for keyPath: '' 

問題は私の「//old_lady/bird/spider/fly」キーパスにあると確信していますが、後でソリューションをモデル化するための同様の例が見つかりません。ハーフ?

4

1 に答える 1

9

私はばかのように感じます。これに1日以上立ち往生した後、stackoverflowに投稿した直後に解決策を発見しました.

私の問題は、XPath の概念を、キー値コーディング キー パスの Objective-C の概念と混同したことです。

実際、これを使用して:

[RKObjectManager.sharedManager.mappingProvider setMapping:mapping 
forKeyPath:@"old_lady.bird.spider.fly"]; 

結果を次のようにログに記録します。

- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects: 
(NSArray *)objects 
{ 
    for (Fly *fly in objects) 
    { 
        NSLog(@"%@, %@, %@", fly.reason, fly.action, fly.name); 
    } 
} 

予想どおり、コンソールに次のように表示されます。

2012-05-08 14:08:50.173 Foo[26922:207] why oh why?, swallowed, Al 
2012-05-08 14:08:50.173 Foo[26922:207] why oh why?, swallowed, Bob 
2012-05-08 14:08:50.175 Foo[26922:207] why oh why?, swallowed, Cory 
2012-05-08 14:08:50.176 Foo[26922:207] why oh why?, swallowed, Dan 
2012-05-08 14:08:50.176 Foo[26922:207] why oh why?, swallowed, Edgar 
于 2012-05-09T19:13:52.430 に答える