在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);
}
答案 0 :(得分:0)
而不是
"//div[contains(@id,'art')][1]"
你想要
"(//div[contains(@id,'art')])[1]"
原因与绑定优先级有关。您可能知道,[1]
是[position() = 1]
的简写。在您尝试使用的变体中,这意味着“当前节点(div
元素)是其父节点的第一个子节点时”。显然,可能会有许多这样的div,每个div都是他们各自父母的第一个孩子。
当您在表达式//div[predicate]
周围添加括号并将[1]
附加到该表达式时,那么您问的是您想要问的问题:{{1}选择的节点集中的第一个节点是什么}}?