TBXML解析问题,而值无法在UILabel中获取

时间:2012-07-05 07:37:56

标签: iphone ios xcode nsurlconnection tbxml

在我的应用程序中,我正在使用TBXML解析器,我需要从xml文件中获取值并将其打印在标签上...这是我在服务器中的xml文件

 <gold>
 <price>
 <title>22 K Gold</title>
 </price>
 <price>
 <title>24 K Gold</title>
 </price>
 </gold>

我的Viewcontroller.h看起来像

#import <UIKit/UIKit.h>
#import "TBXML.h"

 @interface ViewController : UIViewController{

IBOutlet UILabel *lab;
TBXML *tbxml;
}



@end

我的Viewcontrooler.m看起来像

 - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSData *xmlData = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:@"http://www.abcde.com/sample.xml"]];
 tbxml = [[TBXML alloc]initWithXMLData:xmlData];


TBXMLElement * root = tbxml.rootXMLElement;

if (root)
{
    TBXMLElement * elem_PLANT = [TBXML childElementNamed:@"price" parentElement:root];
    while (elem_PLANT !=nil)
    {
        TBXMLElement * elem_BOTANICAL = [TBXML childElementNamed:@"title" parentElement:elem_PLANT];
        NSString *botanicalName = [TBXML textForElement:elem_BOTANICAL];
        lab.text=[NSString stringWithFormat:@"re %@", botanicalName];

        elem_PLANT = [TBXML nextSiblingNamed:@"price" searchFromElement:elem_PLANT]; 

        elem_BOTANICAL = [TBXML childElementNamed:@"title" parentElement:elem_PLANT]; 

        botanicalName = [TBXML textForElement:elem_BOTANICAL];
        lab1.text=[NSString stringWithFormat:@"re %@", botanicalName];
    }
}

}

我正在获取BAD_ACCESS线程。我遗漏了任何东西......帮助请...

2 个答案:

答案 0 :(得分:1)

lab.text=[NSString stringWithFormat:@"re %@",elem_BOTANICAL];

修改1.0:

lab.text=[NSString stringWithFormat:@"re %@", botanicalName];

编辑2.0:

lab.text=[NSString stringWithFormat:@"re %@", botanicalName];

NSString *plantName = [TBXML textForElement: elem_PLANT];

lab1.text=[NSString stringWithFormat:@"re %@", plantName];

答案 1 :(得分:1)

首先,我建议您使用单独的方法解析XML文件,以便View不会弄乱您的模型。为XML项创建对象模型。然后,例如,在一个方法中,您使用表示XML文件中项目的对象填充数组。只有这样,当您通过解析XML检索这些对象时,您应该将此数组与您的视图绑定。

第二件事是你应该把这一行

elem_PLANT = [TBXML nextSiblingNamed:@"price" searchFromElement:elem_PLANT];

在while循环结束时,因为在第一次迭代中,您只使用第一个项目,这是在循环开始之前检索的。因此,如果你把它放在中间,就像你所做的那样,在解析XML的最后,在这一行之后的下一行将使用一个nil对象。

第三件事是在从TBXMLElement获取文本之前,你应该检查它是否不是nil:

NSString *plantName;
if (elem_PLANT) {
 plantName = [TBXML textForElement: elem_PLANT]; 
}