【问题标题】:parse value from a dictionary/list从字典/列表中解析值
【发布时间】:2011-06-21 12:46:51
【问题描述】:

我有一个字典/列表 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 的第二部分被删除了......即节点内容 = 1501042000; 节点名 = 金额;

我不确定如何访问该部分。

请帮忙。 }
}

实际上,这是我在交替运行期间得到的;

nodeChildArray的打印说明: {type = 可变字典,count = 2, 条目 => 0 : {contents = "nodeName"} = {contents = "Signature"} 1:{contents = "nodeContent"} = {contents = "-1507"} }

nodeChildArray的打印说明: {type = 可变字典,count = 2, 条目 => 0 : {contents = "nodeName"} = {contents = "Amount"} 1:{内容=“节点内容”}={内容=“631000”} }

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

【问题讨论】:

    标签: iphone objective-c parsing nsxmlparser libxml2


    【解决方案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-&gt;NSDictionary-&gt;NSArray-&gt;NSString &lt;--&gt; [[[[NSArray objectAtIndex:i] NSDictionary objectForKey:@"nodeChildArray"] NSArray objectAtIndex:j] NSDictionary objectForKey:@"nodeContent"],最后返回一个NSString。使用它作为最新的代码 - 在我通过balance_sign_dict 作为NSDictionary 的代码的最后一个版本中。 这甚至可能奏效!但是正确地转换参数是更好的形式。如果您不知道您的字典是以NSArray 还是NSDictionary 开头,您可以将其转换为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;
    }
    

    【讨论】:

    • 嘿汤姆森......非常感谢......答案似乎与我正在寻找的内容一致......但只有一个问题;我可以使用该函数根据为签名传递的值返回值吗?如果我想要具有 -873 的“签名”节点的“金额”节点的值)即它应该返回我 1501042000 即如果我将签名“-873”传递给函数,它应该返回我 1501042000
    • @Thomson Comer:nodeChildArray 的类型似乎存在一些问题。它实际上似乎是返回一个字典而不是一个数组。我刚刚检查了调试器,结果我仍然没有得到正确的结果。
    • hmthur,对不起,我知道我的错误在哪里了。我更新了答案,它现在应该可以满足您的要求。您将返回一个 NSDictionary,其中说 [myDict objectForKey:@"-873"] 将为 balance_sign_dict 中的所有元素返回 1501042000。
    • @Thomson Comer:不用说对不起。相反,我应该感谢您提供的所有帮助。只是为了确认,我将添加函数 parseBalance: 您已更新并使用它调用它; NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init]; NSString *tmpStr; myDict = [self parseBalance:balance_sign_dict]; tmpStr = [myDict objectForKey:@"-873"];我需要传递 self.balance_sign_dict 还是只传递 balance_sign_dict?您能否确认我的方法现在是否正确?
    • 正如您所写,myDict 实际上会成为内存泄漏,因为您分配它然后立即用 parseBalance: 的返回结果覆盖它。相反,只需说NSMutableDictionary *myDict = [self parseBalance:balance_sign_dict];。如果您需要将 myDict 存储在退出当前范围时存在的成员变量中,则必须保留它。我认为您不需要通过 self.balance_sign_dict。只要@property 未设置为readonly,我认为在读取值时 self.balance_sign_dict 和 balance_sign_dict 之间没有任何区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多