Visual Studio 내에서 ASPX 파일을 구문 분석하기 위해 HTML 민첩성 팩을 사용하고 있습니다.
지정한 ID 특성을 가진 요소를 찾고 있습니다.
내가 사용하는 코드는 다음과 같습니다.
var html = new HtmlAgilityPack.HtmlDocument();
html.LoadHtml(docText);
if (html.DocumentNode != null)
{
try
{
var tagsWithId = html.DocumentNode.SelectNodes(string.Format("//[@id='{0}']", selector.Id));
그러나이 코드를 실행하면 "표현식을 노드 집합으로 평가해야합니다."라는 예외가 발생합니다.
누구나 왜 이것이 " 꼭 "노드 집합으로 평가 되어야 하는지 말해 줄 수 있습니까? 왜 단순히 노드를 반환하지 못하는 것입니까? (다음 줄은 tagsWithId.Count를 호출합니다)? 확실히 SelectNodes 메서드에 의해 반환되는 HtmlNodeCollection에는 0 개의 노드가 포함될 수 있습니까?
또는 잘못된 형식의 Xpath 표현으로 인한 오류입니까? [내가 테스트하고있는 선택기 ID가 <div id = "thisId">처럼 파일에 존재합니다.]
Visual Studio에서 직접 ASPX 파일을로드 할 수 있습니까 (추가 기능을 구축하고 있습니다) 또는 XML 오류가 포함되어 있으며 대신 출력 HTML 스트림을로드해야합니다 ( 즉 , 시작시 페이지 선언없이로드해야합니다.) 파일 등의 )?
문제는 SelectNodes()
의 인수에 있습니다.
//[@id='{0}']
(교체를 수행 한 후) sybtactically 합법적 인 XPath 표현되지 않습니다 . 따라서 문제는 XPath 표현이 "노드를 반환하지 않음"이 아니라 구문 적으로 불법이라는 것입니다.
XPath W3C 스펙에 따라 :
" //
는 /descendant-or-self::node()/
"의 줄임말입니다.
따라서 위의 내용은 다음과 같이 확장됩니다.
/descendant-or-self::node()/[@id='{0}']
마지막 위치 단계에는 노드 테스트가없고 술어로 시작됩니다. 이것은 XPath의 구문 규칙에 따라 불법입니다.
아마 당신이 원하는 :
//*[@id='{0}']