libxml x路径表达式未解释

时间:2012-01-19 18:21:42

标签: ios xml libxml2

我有以下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,即我想要的值。实际上非常合乎逻辑,因为不能有任何节点集:)

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并遍历返回的节点集