가장 가까운 선행 형제를 찾기위한 XPath 문

c# html-agility-pack xpath

문제

C # WPF 응용 프로그램에서 HTMLAgilityPack을 사용하여 로컬 HTML 페이지의 앵커 태그를 반복하고 href 특성을 추출합니다. 이것은 훌륭하게 작동하지만 앵커가 HTML 문서 (앵커 태그이기도 함) 내에있는 제목을 찾아야합니다. 이것은 XPath로 할 수있을 정도로 쉽지만, 모든 시나리오에서 작동하는 진술을 얻지 못하는 것 같습니다.

다음은 HTML에 대한 예제입니다 (제어 할 수 없음).

<html>
    <body>
        <table>
            <tr>
                <td><div><a href="#maintitle" class="title">maintitle</a></div></td>
            </tr>
            <tr>
                <td><div><a href="#subtitle1" class="subtitle">subtitle1</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link1.pdf">link1</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link2.pdf">link2</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link3.pdf">link3</a></div></td>
            </tr>
            <tr>
                <td><div><a href="#subtitle2" class="subtitle">subtitle2</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link4.pdf">link4</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link5.pdf">link5</a></div></td>
            </tr>
        </table>
    </body>
</html>

link1을 찾은 후 부제 1을 찾고 싶습니다. link2 및 link3도 마찬가지입니다. 하지만 link4와 link5에 대해서는 부제 2를 찾고 싶습니다. 이 XPath 문을 사용하고 있습니다 (첫 번째 섹션은 온라인 XPath 계산 프로그램 https://www.freeformatter.com/xpath-tester.html 에서 사용하고있는 앵커 태그 선택을 시뮬레이트하기위한 것입니다) :

//a[@href='link4.pdf']/ancestor::tr/preceding-sibling::tr//a[@class='subtitle']

이것은 link1에 대한 link1에 대해 작동하지만 link4 및 link5에 대해서는 subtitle1과 subtitle2를 모두 반환합니다. preceding-sibling::t [1] 을 추가하면 link4에 대해 수정되지만 link2, link3 및 link5에 대해서는 중단됩니다.

//a[@href='link4.pdf']/ancestor::tr/preceding-sibling::tr[1]//a[@class='subtitle']

나는 또한 preceding-sibling::t last() 를 추가하려고 시도했지만이 결과로 인해 링크 중 아무것도 발견되지 않습니다.

//a[@href='link4.pdf']/ancestor::tr/preceding-sibling::tr[last()]//a[@class='subtitle']

나는 간단한 해결책이 있다고 확신하지만 결코 XPath에 유능하지 않으므로 고심하고있다. 가장 가까운 형제를 반환하는 원래 XPath 문을 얻으려면 어떻게해야합니까?

수락 된 답변

링크 텍스트로 자막을 가져 오는 로케이터 ( 'link4')

(//a[text()='link5']/preceding::tr[.//a[@class='subtitle']])[last()]

논리:

//a[text()='link4'] - 링크 된 텍스트로 요소 가져 오기

//a[text()='link4']/preceding::tr - 모든 tr 부모 검색

[.//a[@class='subtitle']] - 클래스' subtitle '이있는 태그 a 를 포함하는 첫 번째 부모 가져 오기

(someLocator)[last()] - 우리의 경우에 일치하는 마지막 요소를 얻는다 - 클래스 ' subtitle '을 가진 태그 a 를 포함하는 마지막 부모를 얻는다.

또 다른 옵션은 - 처음에 검색 tr 대신 요소를 a

(//tr[.//a[text()='link5']]/preceding-sibling::tr//a[contains(@class,'subtitle')])[last()]

잘하면 누군가가 논리를 구축하는 데 도움이 될 것입니다 ob 건물 로케이터


인기 답변

xpath를 사용해보십시오 :

//a[@href='<your_input>']/preceding-sibling::tr[.//a[@class='subtitle']][1]

여기서 <your_input>link1.pdf 에서 link5.pdf 가 될 수 있습니다.



Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow