<p>=.+=</p>
태그가 모두 필요합니다. Regex는 <p>
태그없이 자체적으로 작동합니다.
내 XPath는 다음과 같습니다. "//p[re:test(.,'^=.+=$', 'i')]"
하지만 플러그를 꽂으면 예외가 생깁니다.
HtmlNodeCollection pNodes = htmlDoc.DocumentNode.SelectNodes("//p[re:test(.,'^=.+=$', 'i')]");
예외는 다음과 같습니다.
네임 스페이스 관리자 또는 XsltContext가 필요합니다. 이 쿼리에는 접두사, 변수 또는 사용자 정의 함수가 있습니다.
편집 : Html은 FCKEditor에 의해 생성되며 네임 스페이스가 정의되지 않았습니다. 이 작업을 수행하기 위해 무언가를 설정해야합니까?
HTML :
<p><style type="text/css">
h2 a { color: black; }</style></p>
<p>----</p>
<h2>test <a href="http://searisen.com">link</a></h2>
<p>== Heading 2 ==</p>
<p>----</p>
<p>=== Heading [http://searisen.com SeaRisen.com] ===</p>
이 오류는 표현식 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 솔루션이 있다면 그것을 듣고 싶습니다!