我正在尝试做一些简单的事情,但不知何故它对我不起作用,这是我的代码:
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表达式错了吗?我错过了什么吗?
答案 0 :(得分:5)
使用
var test = e.SelectNodes(".//a[@class='head']");
代替。您当前的代码(//a[]
)搜索从根节点开始的所有元素。如果在前面加上一个点(.//a[]
),则只考虑当前节点的后代。因为在你的情况下它是直接的孩子,你当然也可以这样做:
var test = e.SelectNodes("a[@class='head']");
总是看Xpath spec了解详情。
答案 1 :(得分:0)
var test = e.SelectNodes("//a[@class='head']");
这是一个绝对表达式,但你需要一个相对的XPath表达式 - 从e
开始评估。
因此请使用:
var test = e.SelectNodes("a[@class='head']");
请注意:尽量避免使用XPath //
伪操作符,因为这样使用可能会导致效率低下(速度减慢)。
在这个特定的XML文档中,a
元素只是div
的子元素 - 而不是div
以外的无限深度。