我正在为iphone应用编写自定义xml反序列化器。正如您在下面看到的,我循环遍历xml中的所有列表元素,我已经调试过它,并且每个循环都有一个新的不同元素。问题是xpath帮助器方法(与下面发布的方法类似,但对于int和decimal)总是返回相同的值。
例如 - 第一个循环的xml“SomeValue”值将为“abc”,辅助方法将返回“abc”,第二个项目出现并且其xml“SomeValue”为“XYZ”,但辅助方法仍将返回“ABC”。
我是iphone / objective c / memory管理的新手,所以它可以是任何数量的东西。我只是无法确定问题所在:(有人可以提供一些帮助吗?
-(void) deserializeAndCallback:(GDataXMLElement *)response
{
NSError * error;
NSArray *listings = [response nodesForXPath:@"//ListingSummary" error:&error];
NSMutableArray *deserializedListings = [[NSMutableArray alloc] init];
//loop through all listing elements, create a new listing object, set its values, and add
//it to the list of deserialized objects.
if(listings.count > 0)
{
for (GDataXMLElement *listingElement in listings)
{
Listing *list = [[Listing alloc] init];
//xpath helper function (shown below), just to get the value out of the xml
list.someValue = [QuickQuery getString:listingElement fromXPath:@"//SomeValue"];
[deserializedListings addObject:list];
}
}
if([super.delegate respondsToSelector: @selector(dataReady:)])
{
[super.delegate dataReady:deserializedListings];
}
}
+(NSString *) getString:(GDataXMLElement *)element fromXPath:(NSString *)xPath
{
NSError *error;
NSArray *result = [element nodesForXPath:xPath error:&error];
if(result.count > 0)
{
GDataXMLElement *singleValue = (GDataXMLElement *) [result objectAtIndex:0];
return singleValue.stringValue;
[singleValue release];
}
return nil;
[error release];
[result release];
}
编辑:好的......我发现了更多信息。在辅助函数内部,nodesForXpath方法返回整个xml中的所有节点,而不仅仅是我忙于处理的当前元素。 GDataXMLElement是否始终引用其父元素?
xml的样子
<ListingSummary>
<SomeValue>abc</SomeValue>
</ListingSummary>
<ListingSummary>
<SomeValue>jhi</SomeValue>
</ListingSummary>
<ListingSummary>
<SomeValue>xyz</SomeValue>
</ListingSummary>
答案 0 :(得分:2)
您所看到的是您正在使用的XPath查询的正确行为。实际上,您需要查询相对于当前节点的查询,而不是您正在执行的文档根目录。
请参阅http://www.w3schools.com/xpath/
BTW + (NSString *)getString:(GDataXMLElement *)element fromXPath:(NSString *)xPath
是一种类方法,而不是静态方法。
答案 1 :(得分:1)
你说nodesForXPath:
返回整个文档中的所有节点。由于您使用相同的参数@"//SomeValue"
,每个循环调用该方法,因此每次都会返回相同的数组。这意味着[result objectAtIndex:0]
每次都会为您提供相同的对象。
另外,正如我在评论中提到的,您不应该在帮助方法中发布singleValue
,error
或result
。你不拥有这些,而你不是responsible for their memory。另一方面,由于您使用list
创建alloc
,因此执行需要在每个循环结束时释放它;你目前正在每次传递一个Listing
对象。
答案 2 :(得分:0)
对我来说看起来不错。虽然getString:fromXPath:中的发布是不必要的(你不需要释放输入到方法中的参数或从NSArray获得的对象。从NSArray中释放对象的正确方法是将其从数组中删除,对于作为参数传递的对象,如果要释放它,则应在调用方法后执行此操作。
问题的问题必须在其他地方。
答案 3 :(得分:-2)
result.count
应为[result count]
,因为count是一种方法,而不是NSArray
的属性