Ich versuche etwas Einfaches zu tun, aber irgendwie funktioniert es nicht für mich, hier ist mein 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
}
Meine HTML-Seite sieht so aus:
....
<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-->
....
Ist mein XPath-Ausdruck falsch? vermisse ich etwas?
Verwenden
var test = e.SelectNodes(".//a[@class='head']");
stattdessen. Ihr aktueller Code ( //a[]
) durchsucht alle Elemente ab dem Wurzelknoten. Wenn Sie stattdessen einen Punkt .//a[]
( .//a[]
), werden nur die Nachkommen des aktuellen Knotens berücksichtigt. Da es sich in Ihrem Fall um ein direktes Kind handelt, können Sie natürlich auch Folgendes tun:
var test = e.SelectNodes("a[@class='head']");
Einzelheiten finden Sie wie immer in der Xpath-Spezifikation .
var test = e.SelectNodes("//a[@class='head']");
Dies ist ein absoluter Ausdruck, aber Sie benötigen einen relativen XPath-Ausdruck - der von e
ausgewertet werden soll.
Verwenden Sie deshalb :
var test = e.SelectNodes("a[@class='head']");
Hinweis: Vermeiden Sie so oft wie möglich den XPath- //
, da dies zu erheblichen Ineffizienzen führen kann (Verlangsamung).
In diesem speziellen XML - Dokument der a
sind Elemente nur Kinder von div
- nicht bei undefiniertem Tiefe ab div
.