奇怪的NSXMLParser问题

时间:2014-04-05 15:25:03

标签: objective-c xml parsing nsxmlparser

我创建的应用程序几乎是Apple的SeismicXML示例应用程序的克隆,因此我可以了解NSXMLParser的细节。我创建了我自己的.xml文件,并将SeismicXML应用程序中的大部分代码(如果不是全部)复制到我的应用程序XMLTest中。除了一部分外,一切似乎都很好。应用程序运行时,所有文本字段都显示相同的数据。无论我将textField.text设置为显示的解析的哪个属性,它都显示相同的数据,这恰好是解析的最后一个元素。

在调试期间,我进入了解析操作并实现了许多NSLog语句,以查看正在解析的数据。所有NSLog语句都显示正在解析.xml文件的正确元素并将其设置为正确对象的正确属性。

我不确定我的代码的哪一部分是错的,而且我已经自己调试了这个应用程序太多小时了。我认为代码中包含的部分内容可能是问题的罪魁祸首。

在此代码段中,两个标签的值是相同的,它不应该是。

@implementation VTSVehicleTableViewCell

-(void)configureWithVehicle:(VTSVehicle *)vehicle {

self.stockLabel.text = vehicle.stock;
self.infoLabel.text = vehicle.year;

}

以下是模拟器中生成的内容:

Simulator Picture

但是,在此方法的内部,它在控制台中生成以下正确信息:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

if (_accumulatingParsedCharacterData) {
    // If the current element is one whose content we care about, append 'string'
    // to the property that holds the content of the current element.
    //
    NSLog(@"%@", string);
    [self.currentParsedCharacterData appendString:string];
    NSLog(@"%@", string);
}
}

Console Information

它就像车辆对象在解析xml期间和之后都有正确的数据,但是当我去更新视图时,车辆对象中的数据现在只填充了最后一个数据。 xml文件的元素。这是xml文件的样子:

<vehicles published="2014-04-02">
<vehicle>
    <stock>003737</stock>
    <serial>WVWDM7AJ2BW166848</serial>
    <year>2011</year>
    <make>VOLKSWAGEN</make>
    <model>GOLF</model>
    <date>01/05/11</date>
    <price>26540.00</price>
    <invoice>25414.00</invoice>
    <trim>4DR TDI 6SP AUT</trim>
</vehicle>
<vehicle>
    <stock>003974</stock>
    <serial>3VWLL7AJ1CM317028</serial>
    <year>2012</year>
    <make>VOLKSWAGEN</make>
    <model>JETTA</model>
    <date>11/03/11</date>
    <price>0.00</price>
    <invoice></invoice>
    <trim>2.0L TDI 6SP AUTO</trim>
</vehicle>
<vehicle>
    <stock>004104</stock>
    <serial>1VWBH7A38CC061891</serial>
    <year>2012</year>
    <make>VOLKSWAGEN</make>
    <model>PASSAT</model>
    <date>03/05/12</date>
    <price>26665.00</price>
    <invoice>25555.00</invoice>
    <trim>SE W/SR 2.5 6SP AUTO</trim>
</vehicle>
</vehicles>

为什么文本标签显示相同的数据,即使它们是从同一对象的不同属性中提取的呢?

编辑:以下是cellForRowAtIndexPath的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *kVehicleCellID = @"VehicleCellID";
VTSVehicleTableViewCell *cell = (VTSVehicleTableViewCell *)[tableView dequeueReusableCellWithIdentifier:kVehicleCellID];

// Get the specific vehicle for this row.
VTSVehicle *vehicle = (self.vehicleList)[indexPath.row];

[cell configureWithVehicle:vehicle];

return cell;
}

以下是tableViewCell的代码:

#import "VTSVehicleTableViewCell.h"
#import "VTSVehicle.h"

@interface VTSVehicleTableViewCell ()

// References to the subviews which display the earthquake data.
@property (nonatomic, weak) IBOutlet UILabel *stockLabel;
@property (nonatomic, weak) IBOutlet UILabel *infoLabel;

@end

@implementation VTSVehicleTableViewCell

-(void)configureWithVehicle:(VTSVehicle *)vehicle {

    self.stockLabel.text = vehicle.stock;
    self.infoLabel.text = vehicle.year;

}

@end

1 个答案:

答案 0 :(得分:0)

问题不在foundCharacters,而在didStartElementdidEndElement更有可能。可能发生的情况是,您有一个NSMutableString实例,您为每个元素反复使用,然后在模型中使用该元素值。

currentParsedCharacterData中保存didEndElement的结果时,您应该确保复制该值(而不仅仅是使用对现有NSMutableString的引用。例如,您可以使用NSString属性定义为copy属性,而不是strong属性。或者,如果您只是将其放入字典或数组中,请使用{ {1}}而不仅仅是[self.currentParsedCharacterData copy]。这将确保您在模型中保存的每个元素最终都作为单独的currentParsedCharacterData实例(顺便说一下,确保这些对象不再是变)。

很明显,正如亚马逊所说,NSString可能存在一个简单的问题,但我怀疑cellForRowAtIndexPath代码更可能是罪魁祸首。