2012-01-05 6 views
2

私は本当に混乱しているXMLから変換されたNSDictionaryを持っています。あなたが見て、class_idキーのためのオブジェクトを取得するための最良の方法を教えていただけたら、私は本当にそれを感謝します。複合NSDictionary。 Objectforkeysを取得し、それらをNSArrayまたは別々の変数としてソートしますか?

{ 
    response= { 
     "@status" = ok; 
     rosters =   { 
        "@page" = 1; 
        "@page_count" = 1; 
        "@records_per_page" = 50; 
        "@total_record_count" = 8; 
        roster =    (
              { 
             "@class_id" = 0001; 
             "@role" = 0; 
             "@user_id" = 12345; 
             class=     { 
                   "@active" = false; 
                   "@name" = NAME; 
                   } 
              } 
              { 
             "@class_id" = 0002; 
             "@role" = 0; 
             "@user_id" = 12345; 
              } 
              { 
             "@class_id" = 0003; 
             "@role" = 0; 
             "@user_id" = 12345; 
              } 
              ); 
          } 
       } 
} 

私がやりたいと思っていますすべては、個々のCLASS_ID年代の変数を設定したり、NSArrayの中CLASS_ID年代のすべてを置くのいずれかです。私はリンゴのドキュメントを読んでいて、考えられるすべての方法を試しましたが、nsexceptionでクラッシュするか、データを返しません。助けてくれてありがとう。

これで分をバックアップします。これをNSDictionaryに変換するために使用したXMLReaderプラグインは、必要以上に複雑になっているようです。ここにオリジナルのXMLデータがあります。

<response status="ok"> 
<rosters page_count="1" page="1" records_per_page="50" total_record_count="7"> 
<roster class_id="0001" role="S" user_id="91563" roster_id="ID"/> 
<roster class_id="0002" role="S" user_id="91563" roster_id="ID"/> 
<roster class_id="0003" role="S" user_id="91563" roster_id="ID"/> 
<roster class_id="0004" role="S" user_id="91563" roster_id="ID"/> 
<roster class_id="0005" role="S" user_id="91563" roster_id="ID"/> 
<roster class_id="0006" role="S" user_id="91563" roster_id="ID"/> 
<roster class_id="0007" role="S" user_id="91563" roster_id="ID"/> 
</rosters> 
</response> 

誰でも簡単な方法でclass_id値を取得することはできますか?それを行うには合理的な方法NSDictionaryに変換されますか?私は別々の変数またはNSArrayとしてデータを必要とします。

+0

残念ながら、キー名の中の '@'文字は、そうでない場合よりも少し痛みを感じます。そうでなければ、これがあなたの辞書であれば、次のようにすることができます: 'NSArray * classIDs = [resposne_dict valueForKeyPath:@" response.rosters.roster.class_id]; '。配列の配列 –

+0

@JasonCoco多分、彼は彼が望むことをするために@文字をエスケープすることができますか?ala NSArray * classIDs = [response_dict valueForKeyPath:@ "response.rosters.roster。\ @ class_id];' ??? –

+0

@MichaelDautermannそれは可能ですが、わかりませんでしたし、それを見ることができなかったので、私はコメントで回答しました。あなたが確認する立場にいるなら、そうすることを提案し、答えを書く;) –

答えて

2

"ベストメソッド"について心配する必要はありません。後で再訪するのを混乱させない方法を使用して、より重要なものに進むことができます。

NSMutableArray *classIds = [NSMutableArray array]; 
NSDictionary *rosterArray = [convertedXmlDictionary valueForKeyPath:@"response.rosters.roster"]; 
for (NSDictionary *roster in rosterArray) { 
    [classIds addObject:[roster objectForKey:@"@class_id"]]; 
} 
+0

は魅力的に働いた。ありがとうございました – davis

+0

あなたにこれをするのは大嫌いですが、私は立ち往生しています。私は上記のcoverteddictionaryに別のレイヤーを追加し、 "名前"にアクセスする方法を理解できません。 NSMutableArrayとして「クラス」を設定した場合、objectForKeyはNSArrayメソッドではないため、「名前」にアクセスできません。それは理にかなっていますか? – davis

+0

nevermind私はそれをvalueforkeypath:@ "response.rosters.roster.class"を使って得ました。ありがとう – davis

関連する問題