2011-05-26 46 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