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 페이지는 다음과 같습니다.

....
<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는 합법적입니까? 예, 이유를 알아보십시오.