HTML Agility Pack을 사용하여 HTML에 ID를 쿼리하는 중 예외

html html-agility-pack parsing xpath

문제

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}']



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