Xpath 如何找到包含此文本的页面上的第一个链接?
如果我有两个链接:Xpath 如何找到包含此文本的页面上的第一个链接?,xpath,Xpath,如果我有两个链接: <div class="abc"> <a id="def1" href="/definitely">Definitely 1</a> <a id="def2" href="/definitely">Definitely 2</a> </div> 但似乎没有 我做错了什么?您的XPath表达式选择了第一个元素,该元素的每个div的href都是正确的,并且每个div的类都包含一个元素。因此,
<div class="abc">
<a id="def1" href="/definitely">Definitely 1</a>
<a id="def2" href="/definitely">Definitely 2</a>
</div>
但似乎没有
我做错了什么?您的XPath表达式选择了第一个元素,该元素的每个div的href都是正确的,并且每个div的类都包含一个元素。因此,如果有两个匹配的div,每个div都有多个匹配的a元素,那么就会得到一个包含两个元素的结果集——第一个div中的第一个a,第二个div中的第一个a 要仅选择整个结果集的第一个元素,请使用括号,如下所示:
(//div[@class='abc']//a[contains(@href,'def')])[1]
除此之外,经过测试,您的表达式对我来说效果很好。这是一个常见问题解答,为什么
不选择//someName的第一个元素
看一看,人们会意识到事实上
相当于:
这将选择每个someName元素,它是其父节点的第一个someName子元素
因此,如果有两个或多个someName元素是其父元素的第一个someName子元素,则所有这些元素都将被选中
解决方案:
而不是
//someName[1]
使用:
因此,在您的特定情况下,请使用:
除此之外,如果在实际XML文档中指定了默认名称空间,则上述表达式都不会选择任何节点。在带有默认名称空间的文档中选择节点是XPath最大的常见问题。要找到解决方案,只需在此SO标记和Internet上的任何位置搜索默认名称空间。刚刚测试过。你的表达很有效。用什么语言?如果您使用的是.NET,那么问题可能是XML文档和XPath处理器中的名称空间配置不正确。另外,您确定使用的是格式良好的XML吗?好问题,+1。请参阅我的答案以了解解释和解决方案:它不是零基索引?
//someName[1]
//someName[1]
/descendant-or-self::node()/someName[1]
//someName[1]
(//someName)[1]
(//div[@class='abc']//a[contains(@href,'def')]) [1]