논리적 AND가 포함 된 'HTML 민첩성 팩'XPath 쿼리

c# html-agility-pack xpath

문제

텍스트가있는 3 개의 열을 포함하는 처음 2 개의 행이있는 HTML 문서에서 표를 찾으려고합니다.

첫 번째 열에 텍스트가 들어있는 테이블의 처음 2 행을 가진 노드를 반환하려는 다음 쿼리를 사용하려고 시도했습니다.

string xpath = @"//table//table[//tr[1]//td[1]//*[contains(text(), *)] and //tr[2]//td[1]//*[contains(text(), *)]]";
HtmlNode temp = doc.DocumentNode.SelectSingleNode(xpath);

제대로 작동하지 않습니다.

다음은 일치시키려는 표의 일부 샘플 HTML입니다.

string xpath = @"//table//table[//tr[1]//td[1]//*[contains(text(), *)] and //tr[2]//td[1]//*[contains(text(), *)]]";
HtmlNode temp = doc.DocumentNode.SelectSingleNode(xpath);

첫 번째 2 행에 1,3,5 열의 텍스트가 있음을 알 수 있습니다. 그게 내가 일치 시키려고하는거야.

수락 된 답변

//table//table[//tr[1]//td[1]//*[contains(text(), *)] and //tr[2]//td[1]//*[contains(text(), *)]]

이 XPath 표현식에는 많은 문제점이 있습니다 .

  1. //table//tabletable 의 자손 인 table 을 선택 table . 그러나 제공된 XML 문서에는 중첩 테이블이 없습니다.

  2. table[//tr[1]//td[1]//*[contains(text(), *)] . 술어 내부의 //tr절대 Xpath 표현식입니다.이 table 요소를 근간으로하는 하위 트리뿐만 아니라 전체 문서 에서 모든 tr 요소를 선택합니다. 대부분의 아마 당신이 원하는 .//tr 대신 //tr .

  3. //td[1] 은 부모의 첫번째 td 자식 인 임의의 td 요소를 선택합니다. 그러나 아마도 가장 작은 자식 요소 인 td 요소 만 원할 것입니다. 그렇다면이 XPath 표현식을 사용해야합니다. (//td)[1]

  4. //*[contains(text(), *)] 첫 번째 텍스트 노드 하위가 첫 번째 요소 child의 문자열 값을 포함하는 요소를 선택하지만, 단순히 td 에 하위 텍스트 하위 노드가 있는지 확인하기를 원합니다. td[.//text()] 올바르게 선택할 수 있습니다 td[.//text()]

이러한 모든 문제의 수정을 결합하여 아마도 당신이 원하는 것은 다음과 같습니다 :

//table//table[//tr[1]//td[1]//*[contains(text(), *)] and //tr[2]//td[1]//*[contains(text(), *)]]

또는 다음과 같이 동등하지만 더 이해하기 쉽고 오류가 발생하기 쉬운 표현을 작성할 수 있습니다.

//table//table[//tr[1]//td[1]//*[contains(text(), *)] and //tr[2]//td[1]//*[contains(text(), *)]]



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.