2011-02-04 67 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