2011-02-04 96 views
1

我有一個字典/列表balance_sign_dict,我需要根據條件檢索2個值。 這是源XML;從字典/列表解析值

<Value> 
<Signature>-873</Signature> 
<Amount>1501042000</Amount> 
</Value> 

我想從下面顯示的字典中解析數據; 請問我該如何解析條件數據(例如,如果我希望「簽名」節點的「金額」節點的值爲-873),即它應該返回給我1501042000

我想要一種通用的解析方式下面的字典中的值。 balance_sign_dict的

印刷描述:

(
     { 
     nodeChildArray =   (
         { 
       nodeContent = "-873"; 
       nodeName = Signature; 
      }, 
         { 
       nodeContent = 1501042000; 
       nodeName = Amount; 
      } 
     ); 
     nodeName = Value; 
    }, 
     { 
     nodeChildArray =   (
         { 
       nodeContent = "-1228"; 
       nodeName = Signature; 
      }, 
         { 
       nodeContent = 428586000; 
       nodeName = Amount; 
      } 
     ); 
     nodeName = Value; 
    }, 
     { 
     nodeChildArray =   (
         { 
       nodeContent = "-1140"; 
       nodeName = Signature; 
      }, 
         { 
       nodeContent = 79370000; 
       nodeName = Amount; 
      } 
     ); 
     nodeName = Value; 
    }, 

這是我現在想;

for (NSDictionary *valueNode in balance_sign_dict){ 
      for (NSArray *nodeChildArray in [valueNode objectForKey:@"nodeChildArray"]){ 
       NSString *tmpNodeName = [nodeChildArray objectAtIndex:1]; 
       NSDictionary *tmpD = [valueNode objectAtIndex:1]; 


       if ([tmpNodeName isEqualToString:@"Signature"]) { 
        tmpSignVal = [nodeChildArray objectAtIndex:0]; 
        if ([tmpSignVal isEqualToString:@"-873"]) { 
         tmpSignAmt = [nodeChildArray objectAtIndex:1]; 
        } 
       } 

但由於某些原因nodeChildArray的第二部分被刪除......即, nodeContent = 1501042000; nodeName =金額;

我不知道如何訪問該部分。

請幫忙。 }
}

實際上,這是我在交替運行期間得到的; nodeChildArray的

印刷描述: {類型=可變的字典,計數= 2, 條目=> 0:{內容= 「nodeName的」} = {內容= 「簽名」} 1:{內容=「nodeContent 「} = {內容= 「-1507」 nodeChildArray的}}

印刷描述: {類型=可變的字典,計數= 2, 條目=> 0:{內容= 「nodeName的」} = {內容=「Amount」} 1:{contents =「nodeContent」} = {contents =「631000」} }

如何獲得匹配簽名值的金額值?

回答

1

NSArrayNSDictionary是我熟悉的任何語言的最好的容器類。 NSDictionary可以存儲任何對象或原語,包括NSArray,反之亦然。當我說字典時,我會隨意地提到任何一類。

當輸出任何字典的描述時(與NSLog(@"%@",myDict);一樣簡單,字典的全部內容就像XML(或者更確切地說是一個JSON)文檔一樣顯示),很容易查看字典的描述來確定什麼是包含內部。()表示NSArray{}表示NSDictionary

// this is the beginning of an array. 
(
     // this is the beginning of index 0 of the array, an `NSDictionary` 
     { 
     // objectForKey:@"nodeChildArray"] isKindOfClass:[NSArray class]] 
     nodeChildArray =   (// inside nodeChildArray is another array 
         { // index 0 of array is a dictionary with two keys 
       // objectForKey:@"nodeContent" == @"-873" 
       nodeContent = "-873"; 
       // objectForKey:@"nodeName" == @"Signature" 
       nodeName = Signature; 
      }, // end of index 0 
         { // index 1 of array 
       nodeContent = 1501042000; 
       nodeName = Amount; 
      } // end of index 1 
     ); // end of nodeChildArray, an NSArray stored at objectForKey:@"nodeChildArray" 
     // this is the only other element in the dictionary, a string 
     // objectForKey:@"nodeName"] isKindOfClass:[NSString class]] 
     nodeName = Value; 
    }, // end of the dictionary containing nodeChildArray and nodeName 
     { // objectAtIndex:1 
     nodeChildArray =   (
         { 
       nodeContent = "-1228"; 
       nodeName = Signature; 
      }, 
         { 
       nodeContent = 428586000; 
       nodeName = Amount; 
      } 
     ); 
     nodeName = Value; 
    }, 
     { // objectAtIndex:2 
     nodeChildArray =   (
         { 
       nodeContent = "-1140"; 
       nodeName = Signature; 
      }, 
         { 
       nodeContent = 79370000; 
       nodeName = Amount; 
      } 
     ); 
     nodeName = Value; 
    }, 
); 

所以,你可以從看你NSDictionary調試輸出,它實際上是一個NSArray看到的。結構的順序是NSArray->NSDictionary->NSArray->NSString <--> [[[[NSArray objectAtIndex:i] NSDictionary objectForKey:@"nodeChildArray"] NSArray objectAtIndex:j] NSDictionary objectForKey:@"nodeContent"] ,最後回來一個NSString。將其用作最近的代碼 - 在我通過balance_sign_dict作爲NSDictionary通過的代碼的最後一個版本中。 這可能甚至奏效!但是,正確地施加論點的形式要好得多。如果您不知道您的字典是否將以NSArrayNSDictionary開頭,則可以將其作爲id進行投射,並使用[theIdObject isKindOfClass:[{NSArray,NSDictionary} class]]檢查其類型。請勿使用{},並在代碼中選擇其中一個。

-(NSDictionary*)parseBalance:(NSArray*)balance_sign_dict 
{ 
    NSMutableDictionary* theResults = [NSMutableDictionary dictionary]; 
    for(NSDictionary* nodeDict in balance_sign_dict) 
    { 
    NSArray* nodeChildArray = [nodeDict objectForKey:@"nodeChildArray"]; 
    [theResults addObject:[[nodeChildArray objectAtIndex:1] objectForKey:@"nodeContent"] forKey:[[nodeChildArray objectAtIndex:0] objectForKey:@"nodeContent"]]; 
    } 
    return theResults; 
} 
+0

嘿湯姆森...非常感謝..答案似乎是沿着我所尋找的線...但只有一個問題; 我可以使用該函數返回基於Signature (例如,如果我需要「簽名」節點的「金額」節點的值爲-873),即它應該返回給我1501042000 即,如果我將該簽名「-873」傳遞給函數,它應該返回給我1501042000 – testndtv 2011-02-05 09:56:20