使用 Html Agility Pack,选择循环中的当前元素 (XPATH)

发布于 2024-12-27 01:33:37 字数 941 浏览 0 评论 0原文

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

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

I'm trying to do something simple, but somehow it doesnt work for me, here's my code:

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
}

my html page looks like this:

....
<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-->
....

Is my XPath expression wrong? am i missing something?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

滥情稳全场 2025-01-03 01:33:37

代替使用

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

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

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

一如既往地查看 Xpath 规范

Use

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

instead. Your current code ( //a[]) searches all a elements starting from the root node. If you prefix it with a dot instead (.//a[]) only the descendants of the current node will be considered. Since it is a direct child in your case you could of course also do:

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

As always see the Xpath spec for details.

泡沫很甜 2025-01-03 01:33:37
 var test = e.SelectNodes("//a[@class='head']");

这是一个绝对表达式,但您需要一个相对 XPath 表达式——要根据 e 进行计算。

因此使用

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

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

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

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

This is an absolute expression, but you need a relative XPath expression -- to be evaluated off e.

Therefore use:

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

Do note: Avoid using the XPath // pseudo-operator as much as possible, because such use may result in significant inefficiencies (slowdown).

In this particular XML document the a elements are just children of div -- not at undefinite depth off div.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文