使用Html敏捷包,选择循环中的当前元素(XPATH)

本文关键字:元素 XPATH 循环 Html 选择 使用 | 更新日期: 2023-09-27 18:20:26

我试图做一些简单的事情,但不知怎么的,它对我不起作用,这是我的代码:

var items = html.DocumentNode.SelectNodes("//div[@class='itembox']");
foreach(HtmlNode e in items)
{
     int x = items.count; // equals 10
     HtmlNode node = e;
     var test = e.SelectNodes("//a[@class='head']");// I need this to return the 
                                                // anchor of the current itembox 
                                                // but instead it returns the
                                                // anchor of each itembox element
     int y =test.count; //also equals 10!! suppose to be only 1
}

我的html页面看起来像这样:

....
<div class="itembox">
    <a Class="head" href="one.com">One</a>
</div>
<div class="itembox">
    <a Class="head" href="two.com">Two</a>
</div>
<!-- 10 itembox elements-->
....

我的XPath表达式有错吗?我是不是错过了什么?

使用Html敏捷包,选择循环中的当前元素(XPATH)

使用

var test = e.SelectNodes(".//a[@class='head']");

相反。当前代码(//a[])从根节点开始搜索所有a元素。如果将其前缀改为句点(.//a[]),则只考虑当前节点的子节点。既然在你的情况下是直接的孩子,你当然也可以这样做:

var test = e.SelectNodes("a[@class='head']");

如需详细信息,请参阅Xpath规范。

 var test = e.SelectNodes("//a[@class='head']");

这是一个绝对表达式,但您需要一个相对XPath表达式——在e之外进行求值。

因此使用

 var test = e.SelectNodes("a[@class='head']");

请注意:尽可能避免使用XPath //伪运算符,因为这样的使用可能会导致效率低下(速度减慢)。

在这个特定的XML文档中,a元素只是div的子元素,而不是在div之外的不确定深度。