2011-05-26 52 views
3

來源是JSON CouchDB中(相關數據):嵌套的NSDictionary與valueForKeyPath返回支架代替的NSString

{ 
"_id":"f994892f3fb525d73b3b6b8a59000e1d", 
"_rev":"3-c431ee9334e9be038d9c935efcf2f049", 
"teiXML":[ 
    { 
    "teiHeader":[ 
     { 
      "fileDesc":[ 
       { 
       "publicationStmt":[ 
        { 
         "publisher":"University", 
         "pubPlace":"Someplace", 
         "idno type=\"callNo\"":"ABC 007", 
         "date":"2007" 
        } 
       ], 

這是的NSDictionary(簡體):

<CCouchDBDocument: 0x5842c0> (id:f994892f3fb525d73b3b6b8a59000e1d rev:4-3fc1a36de622529cd67416c9e5ae88da { 
"_id" = f994892f3fb525d73b3b6b8a59000e1d; 
"_rev" = "4-3fc1a36de622529cd67416c9e5ae88da"; 
teiXML =  (
      { 
     teiHeader =    (
          { 
       fileDesc =      (
              { 
         publicationStmt =        (
                  { 
           date = 2007; 
           "idno type=\"callNo\"" = "ABC 007"; 
           publisher = "University"; 

我想獲得「出版商」的價值,所以我嘗試使用valueForKeyPath:

NSLog(@"%@",[doc valueForKeyPath:@"content.teiXML.teiHeader.fileDesc.publicationStmt.publisher"]); 

但代替值「Un大學「我得到這個作爲輸出:

1> 2011-05-26 10:10:02.717 MyApp[12770:707] (
     (
       (
         (
       "University" 
      ) 
     ) 
    ) 
) 

這是相當惱人的。我可以用indexAtObject組合得到值:

NSLog(@"%@",[[[[[doc valueForKeyPath:@"content.teiXML.teiHeader.fileDesc.publicationStmt.publisher"] objectAtIndex:0] objectAtIndex:0] objectAtIndex:0] objectAtIndex:0]); 

有什麼東西一定是錯的嗎?還有更多值需要提取,我不想計算需要多少個objectAtIndex重複才能使其工作。

回答

4

你提到的是「xml」標籤,所以我想你的NSDictionary是由某些XML數據構建的。在這種情況下,一個假說可以解釋這種行爲是你的XML包含重複鍵,像:

<values> 
    <value> 
    ...... 
    </value> 
    <value> 
    ...... 
    </value> 
    ... 
</values> 

事實上,像在實例重複值不適合通過鍵 - 值編碼進行處理,並內部處理爲NSArray s。現在,你爲什麼在你的回覆中得到這麼多嵌套數組的實際細節很難找到,但這可能會給你提示發生了什麼。

如果這個假設不適用於您的情況,請分享您建立NSDictionary的方式。

編輯:在看你的JSON後,有一些東西看起來對我來說並不明顯。看看這個:

"publicationStmt":[ 
       { 
        "publisher":"University", 
        "pubPlace":"Someplace", 
        "idno type=\"callNo\"":"ABC 007", 
        "date":"2007" 
       } 
      ], 

我的理解是你嵌套數組:plublicationStmt包含數組([]),其在轉彎包含另一個(密鑰)的陣列({)...

這是有可能的是產生你的結果?

+0

對不起,我將XML轉換爲Jouch for CouchDB,所以NSDictionary是從JSON源構建的,而不是XML。我將把JSON源添加到問題中。 – Patrick 2011-05-26 08:57:18

+0

正如所料,輸出是一個NSArray: '(GDB)PO項 <__ NSArrayI 0x53fcf0>( <__ NSArrayI 0x54d4c0>( <__ NSArrayI 0x55dc10>( <__ NSArrayI 0x554280>( 大學 ) ) ) )'。我真的很好奇爲什麼? – Patrick 2011-05-26 09:56:58

+0

帕特里克,請參閱我的編輯... – sergio 2011-05-26 10:05:34