使用Html Agility Pack,選擇循環中的當前元素(XPATH)

.net c# html html-agility-pack xpath

我正在嘗試做一些簡單的事情,但不知何故它對我不起作用,這是我的代碼:

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頁面如下所示:

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
}

我的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 -不undefinite深度關div




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因