Iphone 解析字典/列表中的值

Iphone 解析字典/列表中的值,iphone,objective-c,parsing,nsxmlparser,libxml2,Iphone,Objective C,Parsing,Nsxmlparser,Libxml2,我有一个字典/列表balance\u sign\u dict,需要根据条件从中检索2个值。 这方面的源XML是 <Value> <Signature>-873</Signature> <Amount>1501042000</Amount> </Value> 这就是我现在正在尝试的 for (NSDictionary *valueNode in balance_sign_dict){ for (NSA

我有一个字典/列表balance\u sign\u dict,需要根据条件从中检索2个值。 这方面的源XML是

<Value>
<Signature>-873</Signature>
<Amount>1501042000</Amount>
</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的打印说明: {type=mutable dict,count=2, 条目=> 0:{contents=“nodeName”}={contents=“Signature”} 1:{contents=“nodeContent”}={contents=“-1507”} }

nodeChildArray的打印说明: {type=mutable dict,count=2, 条目=> 0:{contents=“nodeName”}={contents=“Amount”} 1:{contents=“nodeContent”}={contents=“631000”} }


如何获取匹配签名值的金额值?

NSArray
NSDictionary
是我所知道的最好的容器类,在我所熟悉的任何语言中都是如此
NSDictionary
可以存储任何对象或原语,包括
NSArray
,反之亦然。当我说dictionary时,我是任意指这两个类

当您输出任何字典的描述(简单到
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
debug输出可以看出,它实际上是一个
NSArray
。结构的顺序是
NSArray->NSDictionary->NSArray->NSString[[[[NSArray objectAtIndex:i]NSDictionary objectForKey:@“nodeChildArray”]NSArray objectAtIndex:j]NSDictionary objectForKey:@“nodeContent”]
,最后返回一个
NSString
。将此作为最新的代码-在我传递的代码的最后一个版本中,
balance\u sign\u dict
作为
NSDictionary
。这甚至可能有效!但正确地强制转换参数更好。如果你不知道你的字典是否会启动t使用
NSArray
NSDictionary
,您可以将其转换为
id
,并使用
[对象是类的种类:[{NSArray,NSDictionary}class]]
检查其类型。不要使用
{/code>,然后在代码中选择其中一个

-(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;
}

NSArray
NSDictionary
是我所熟悉的任何语言中最好的容器类。
NSDictionary
可以存储任何对象或原语,包括
NSArray
,反之亦然。当我说dictionary时,我任意引用任何一个类

当您输出任何字典的描述(简单到
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
debug输出可以看出,它实际上是一个
NSArray
。结构的顺序是
NSArray->NSDictionary->NSArray->NSString[[[[NSArray objectAtIndex:i]NSDictionary objectForKey:@“nodeChildArray”]NSArray objectAtIndex:j]NSDictionary objectForKey:@“nodeContent”]
,最后返回一个
NSString
。将此作为最新的代码-在我传递的代码的最后一个版本中,
balance\u sign\u dict
作为
NSDictionary
。这甚至可能有效!但正确地强制转换参数更好。如果你不知道你的字典是否会启动t使用
NSArray
NSDictionary
,您可以将其转换为
id
,并使用
[对象是类的种类:[{NSArray,NSDictionary}class]]
检查其类型。不要使用
{/code>,然后在代码中选择其中一个

-(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;
}

嘿,汤姆森…非常感谢..答案似乎与我正在寻找的内容一致…但只有一个问题;我可以使用函数根据传递给签名的内容返回值吗?例如,如果我希望“签名”节点的“金额”节点的值为-873),即它应该返回我1501042000,即如果我传递签名“-873”对于函数,它应该返回我1501042000@ThomsonComer:nodeChildArray的类型似乎有问题。它实际上似乎返回的是dict而不是数组。我刚刚检查了调试器,结果仍然没有得到正确的结果。嗯,对不起,我知道我的错误在哪里了。我更新了答案,结果是错误的你现在可以按要求做了。你会得到一本NSDictionary,上面写着[myDict objectForKey:@“-873”]将为balance\u sign\u dict中的所有元素返回1501042000。@Thomson Comer:不必说抱歉。相反,我应该说谢谢您提供的所有帮助。为了确认,我将添加parseBalance:函数,您已经更新了该函数,并使用;NSMutableDictionary*myDict=[[NSMutableDictionary alloc]init]调用它;NSString*tmpStr;myDict=[self-parseBalance:balance_-sign_-dict];tmpStr=[myDict-objectForKey:@“-873”];我需要通过self.balance\u sign\u dict还是仅仅通过balance\u sign\u dict?请确认我的方法现在是否正确?正如您所写的,myDict实际上会成为内存泄漏,因为您分配了它,然后立即用parseBalance.的返回结果覆盖它。相反,只需说
NSMutableDict即可