【问题标题】:Using Html Agility Pack, Selecting the current element in a loop (XPATH)使用 Html Agility Pack,在循环中选择当前元素(XPATH)
【发布时间】:2012-02-10 22:00:36
【问题描述】:

我正在尝试做一些简单的事情,但不知何故它对我不起作用,这是我的代码:

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 表达式有误吗?我错过了什么吗?

【问题讨论】:

    标签: c# .net html xpath html-agility-pack


    【解决方案1】:

    使用

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

    相反。您当前的代码 (//a[]) 从根节点开始搜索所有 a 元素。如果您使用点作为前缀 (.//a[]),则只会考虑当前节点的后代。由于在您的情况下它是直接孩子,您当然也可以这样做:

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

    一如既往地查看Xpath spec了解详情。

    【讨论】:

    • 哇,那个点快把我逼疯了。谢谢伙计,经过 3 个小时的工作,你在 1 分钟内为我搞定了,哈哈,我应该早点问的
    【解决方案2】:
     var test = e.SelectNodes("//a[@class='head']");
    

    这是一个绝对表达式,但您需要一个相对 XPath 表达式 -- 用于评估 e

    因此使用

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 2011-11-08
      • 2013-02-13
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      相关资源
      最近更新 更多