在libxml中选择使用xPath验证condiction的第一个元素

时间:2014-01-13 14:41:07

标签: c xpath libxml2

在libxml中,我尝试选择第一个使用xpath验证条件的元素。如果我理解正确,“// div [contains(@ id,'art')] [1]”在xpath中只会给出一个元素,尽管我得到的不止一个。我在libxml教程中使用函数getnodeset(参见here)。这是代码:

xmlXPathObjectPtr result=getnodeset(def,(xmlChar*) "//div[contains(@id,'art')][1]"); // where def is a htmlDocPtr
xmlNodeSetPtr nodeset;
if(result)
{
nodeset=result->nodesetval;

if(nodeset->nodeNr>1)
    fprintf(stderr,"%i first div with id attribute *art* : %s\n",nodeset->nodeNr,nomDef);
}

1 个答案:

答案 0 :(得分:0)

而不是

"//div[contains(@id,'art')][1]"

你想要

"(//div[contains(@id,'art')])[1]"

原因与绑定优先级有关。您可能知道,[1][position() = 1]的简写。在您尝试使用的变体中,这意味着“当前节点(div元素)是其父节点的第一个子节点时”。显然,可能会有许多这样的div,每个div都是他们各自父母的第一个孩子。

当您在表达式//div[predicate]周围添加括号并将[1]附加到该表达式时,那么您问的是您想要问的问题:{{1}选择的节点集中的第一个节点是什么}}?