re : test () XPath to HtmlAgilityPack (정규식이 일치하는 모든 p 태그 가져 오기)

c# html html-agility-pack xpath

문제

<p>=.+=</p> 태그가 모두 필요합니다. Regex는 <p> 태그없이 자체적으로 작동합니다.

내 XPath는 다음과 같습니다. "//p[re:test(.,'^=.+=$', 'i')]"

하지만 플러그를 꽂으면 예외가 생깁니다.

HtmlNodeCollection pNodes = htmlDoc.DocumentNode.SelectNodes("//p[re:test(.,'^=.+=$', 'i')]");

예외는 다음과 같습니다.

네임 스페이스 관리자 또는 XsltContext가 필요합니다. 이 쿼리에는 접두사, 변수 또는 사용자 정의 함수가 있습니다.

편집 : Html은 FCKEditor에 의해 생성되며 네임 스페이스가 정의되지 않았습니다. 이 작업을 수행하기 위해 무언가를 설정해야합니까?

HTML :

HtmlNodeCollection pNodes = htmlDoc.DocumentNode.SelectNodes("//p[re:test(.,'^=.+=$', 'i')]");

수락 된 답변

이 오류는 표현식 re:test 가 XSLT 컨텍스트에서 알 수없는 test 라는 XPath 함수 (접두사가 re 인 네임 스페이스에서 선언 됨)를 사용하기 때문에 발생합니다.

어디에서 그 표현을 얻었는지 모르지만 표준이 아니므로 Html Agility Pack 컨텍스트에서는 아무 것도 의미하지 않습니다 :-)

자세한 설명은 XPath에 사용자 정의 함수 추가를 참조하십시오. 당신이이 기술을 사용하여 작업 할 있습니다.

즉, 여기에 "순수한"HTML 민첩성 팩 / XPATH 구현 :

var pNodes = htmlDoc.DocumentNode.SelectNodes("//p[text()='=.+=']");

필터 ([와] 사이)와 "내부 텍스트"를 의미하는 표준 XPATH 함수 text ()를 사용합니다.


인기 답변

분명히 HtmlAgilityPack은 네임 스페이스를 처리하지 않습니다. 그래서 나는이 해킹을 생각해 냈습니다.

var pNodes = htmlDoc.DocumentNode.SelectNodes("//p")
    .Where(node => Regex.Match(node.InnerText, "^=.+=$").Success);

HtmlAgilityPack 솔루션이 있다면 그것을 듣고 싶습니다!




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