Html Agility Packを使用して、ループ内の現在の要素を選択する(XPATH)

.net c# html html-agility-pack xpath

質問

私は何かシンプルなことをしようとしているが、何とかそれは私のために働くdoesnt、ここに私のコードです:

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式は間違っていますか?私は何かが欠けていますか?

受け入れられた回答

つかいます

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は合法ですか? はい、理由を学ぶ