我有以下xml文本
<?xml version="1.0" encoding="UTF-8"?>
<projects type="array">
<project>
<created-on type="date">2012-01-17</created-on>
<id type="integer">8860795</id>
<last-changed-on type="datetime">2012-01-17T01:37:25Z</last-changed-on>
</project>
</projects>
所以只有一个项目。但我想算上这些项目。在一个在线xpath评估器中,我的表达式工作正常,返回1。但不是我的libxml方法。我使用以下xpath expresseion:
count(/projects/project)
以及用于评估表达式的以下目标c方法:
-(NSString*) getValueForXPathExpression:(NSString*) xPathExp_ andXMLDoc:(NSData*) xml
{
xmlDoc* doc = xmlParseMemory( [xml bytes], [xml length]);
const unsigned char* xPathExp = (const unsigned char*) [xPathExp_cStringUsingEncoding:NSUTF8StringEncoding];
xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc);
xmlXPathObjectPtr xpathObj = xmlXPathEvalExpression( xPathExp, xpathCtx);
xmlNodeSetPtr nodeSetPtr = xpathObj->nodesetval;
NSString* value;
if( nodeSetPtr != 0 ) {
xmlNode* node = nodeSetPtr->nodeMax > 0 ? nodeSetPtr->nodeTab[0] : 0;
if( node != 0 && [[self stringFromCString:node->name] isEqualToString:@"text"] )
value = [self stringFromCString:node->content];
else
value = [NSString stringWithFormat:@"Node for xpath Exp: %@ does not exist or is not of type text.", xPathExp_];
} else
value = [NSString stringWithFormat:@"nodeSetPtr for %@ is null.", xPathExp_];
//XML-Parser aufräumen
xmlFreeDoc(doc);
xmlCleanupParser();
return value;
}
返回值为
nodeSetPtr for count(/projects/project) is null
我在这里做错了什么?
编辑:我检查过xpathCtx和xpathObj不是null,但xpathObj-&gt; nodesetval是。
Edit2:好的,我发现了。 Count返回一个数字而不是字符串,因此xpathObj-&gt; nodesetval为null,但xpathObj-&gt; floatval为1,即我想要的值。实际上非常合乎逻辑,因为不能有任何节点集:)
答案 0 :(得分:0)
在尝试设置XPath上下文之前,您是否检查过“doc”的值以确保它不是NULL?它看起来像xmlParseMemory函数期望一个以null结尾的缓冲区,我不相信你的[xml字节]会提供它。此外,您没有显示如何创建包含XML的NSData,因此无法看到您是否以xmlParseMemory可以处理它的方式对其进行编码。
假设文档已成功解析,我接下来要检查的是Xpath评估返回的值的类型。在这种情况下,请查看xpathObj-&gt;类型。除非类型是节点集(XPATH_NODESET),否则获取xpathObj-&gt; nodesetval对您没有帮助。我怀疑结果类型是XPATH_NUMBER,而xpathObj-&gt; floatValue将返回正确的计数值1。
根据评估后的逻辑,看起来你可能想要的不仅仅是计数。您可能只想使用/ projects / project的XPath并遍历返回的节点集