Objective c 在IOS中从字典中提取数据
我正在解析xml文件并在字典中获取值,我尝试按名称提取值,但我获取的部分值和剩余值为空。这是我的字典Objective c 在IOS中从字典中提取数据,objective-c,dictionary,Objective C,Dictionary,我正在解析xml文件并在字典中获取值,我尝试按名称提取值,但我获取的部分值和剩余值为空。这是我的字典 dictionary: { "__name" = QF; "_category" = "C&M"; "_id" = AB2001; "_ni_exempt" = no; "_topic" = Alertness; answers = { answer = ( { "_correct" = no
dictionary: {
"__name" = QF;
"_category" = "C&M";
"_id" = AB2001;
"_ni_exempt" = no;
"_topic" = Alertness;
answers = {
answer = (
{
"_correct" = no;
text = "give an arm signal as well as using your indicators";
},
{
"_correct" = no;
text = "signal so that other drivers can slow down for you";
},
{
"_correct" = yes;
text = "look over your shoulder for a final check";
},
{
"_correct" = no;
text = "select a higher gear than normal";
}
);
};
question = {
explanation = {
text = "If you want to make a U-turn, slow down and ensure that the road is clear in both directions. Make sure that the road is wide enough to carry out the manoeuvre safely.";
voice = {
"_id" = "AB2001-2";
};
};
prompt = "Mark one answer";
text = "Before you make a U-turn in the road, you should";
voice = {
"_id" = "AB2001-1";
};
xref = "DES s4, DES s9, HC r159-161";
};
}
这是我试图提取值的代码
-(void)fetchValuesFromDictioanry:(NSDictionary*)xmlDict
{
for (NSString *string in [xmlDict allKeys])
{
if ([[xmlDict valueForKey:string] isKindOfClass:[NSDictionary class]])
{
[self fetchValuesFromDictioanry:[xmlDict valueForKey:string]];
}
else if ([[xmlDict valueForKey:string] isKindOfClass:[NSString class]])
{
if ([string isEqualToString:@"_id"])
{
_lblID.text = [xmlDict valueForKey:@"_id"];
NSLog(@"ZZZ %@",_lblID.text);
_lblAlert.text = [xmlDict objectForKey:@"_topic"];
NSLog(@"Make: %@ ",_lblAlert.text);
_lblxref.text = [xmlDict objectForKey:@"xref"];
NSLog(@"Make: %@ ",_lblxref.text);
_lbltext.text = [xmlDict objectForKey:@"text"];
NSLog(@"Model: %@ ", _lbltext.text);
_lblgraphic.text = [xmlDict objectForKey:@"explanation"];
NSLog(@"Model: %@ ",_lblgraphic.text);
_lblprompt.text = [xmlDict objectForKey:@"prompt"];
NSLog(@"Model: %@ ",_lblprompt.text);
_lblvoice.text = [xmlDict objectForKey:@"_id"];
NSLog(@"Model: %@ ", _lblvoice.text);
}
// NSLog(@"MMM: %@ ", [xmlDict valueForKey:string]);
//Set here other labels
}
else if ([[xmlDict valueForKey:string] isKindOfClass:[NSArray class]])
{
for (NSDictionary *dictionary in [xmlDict valueForKey:string]) {
[self fetchValuesFromDictioanry:dictionary];
}
}
}
}
现在,当我在标签中获取值时,比如在lblID和lblAlert中,它会显示值,但当我尝试获取内部值时,它会显示null,比如lbltext或lblxref。我怎样才能从内部字典中找到值 将函数FetchValuesFromDictionAnry替换为以下内容
-(void)fetchValuesFromDictioanry:(NSDictionary*)xmlDict
{
if ([xmlDict isKindOfClass:[NSDictionary class]])
{
for (NSString *string in [xmlDict allKeys])
{
if ([[xmlDict valueForKey:string] isKindOfClass:[NSDictionary class]])
{
[self fetchValuesFromDictioanry:[xmlDict valueForKey:string]];
}
else if ([[xmlDict valueForKey:string] isKindOfClass:[NSString class]])
{
if ([string isEqualToString:@"_id"])
{
_lblID.text = [xmlDict valueForKey:string];
NSLog(@"ZZZ %@",_lblID.text);
}
else if ([string isEqualToString:@"_topic"])
{
_lblAlert.text = [xmlDict objectForKey:string];
NSLog(@"Make: %@ ",_lblAlert.text);
}
else if ([string isEqualToString:@"xref"])
{
_lblxref.text = [xmlDict objectForKey:string];
NSLog(@"Make: %@ ",_lblxref.text);
}
else if ([string isEqualToString:@"text"])
{
_lbltext.text = [xmlDict objectForKey:string];
NSLog(@"Model: %@ ", _lbltext.text);
}
else if ([string isEqualToString:@"explanation"])
{
_lblgraphic.text = [xmlDict objectForKey:string];
NSLog(@"Model: %@ ",_lblgraphic.text);
}
else if ([string isEqualToString:@"prompt"])
{
_lblprompt.text = [xmlDict objectForKey:string];
NSLog(@"Model: %@ ",_lblprompt.text);
}
else if ([string isEqualToString:@"_id"])
{
_lblvoice.text = [xmlDict objectForKey:string];
NSLog(@"Model: %@ ", _lblvoice.text);
}
}
else if ([[xmlDict valueForKey:string] isKindOfClass:[NSArray class]])
{
for (NSDictionary *dictionary in [xmlDict valueForKey:string]) {
[self fetchValuesFromDictioanry:dictionary];
}
}
}
}
else
{
NSLog(@"Not a dictionary")
}
}
外部字典中的键
answers
是一个具有单个键answer
的字典,其值是一个字典数组,因此您需要以这种方式访问它-首先从answers
获取字典,然后从该字典中的键answer
获取数组,然后迭代数组以获取每个答案词典。你能告诉我如何完成代码吗?@paulw11并非每个键都在要提取的根词典中,例如,提示符
或解释
在键问题
下,但文本
在不同的位置,但肯定不在根目录中;你考虑过了吗?我已经得到了解释、提示和文本值,但现在我对应答标签下的正确和文本标签感到困惑,我如何才能得到这个@holex@Nabeel,它应该是这样的:…=[[[rootDict objectForKey:@“answers”]objectForKey:@“answer”]objectAtIndex:0]objectForKey:@“text”]代码>并且您应该具有“发出arm信号并使用您的指示器”。获取此错误[u nsarray objectForKeyedSubscript:]:未识别的选择器发送到实例0x600000256830 2017-12-13 23:48:45.662669-0800 XML[2175:746546]***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\uu NSArrayM objectForKeyedSubscript:]:发送到实例0x600000256830的选择器无法识别。@Hitesh SULTANIYA如何从同名标记中获取值?@Hitesh SULTANIYA无法捕获if语句的解释。@HiteshSultaniya@Nabeel是印刷“不是字典”吗在日志中?如果是,则说明您的词典中存在问题,我认为否,如果我记录该值,则不是打印词典,而是显示null。@Hitesh Sultaniya