Iphone 解析字典/列表中的值
我有一个字典/列表balance\u sign\u dict,需要根据条件从中检索2个值。 这方面的源XML是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
<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即可