2010-07-04 3 views
2

저는 HTML 민첩성 팩을 사용하여 Visual Studio 내에서 ASPX 파일을 구문 분석합니다.HTML 민첩성 팩을 사용하여 HTML에 ID를 쿼리하는 중 예외가 발생했습니다.

지정된 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">.

으로 명확하게 존재합니다. 추가 기능) XML 오류가 포함되어 있으며 대신 출력 HTML 스트림 (즉 파일 시작 부분에 페이지 선언없이)을로드해야합니다 ().

+0

좋은 질문 (+1). 자세한 설명과 올바른 XPath 표현식을 사용하려면 내 대답을 참조하십시오. :) –

답변

4

문제는 SelectNodes()에 인수에 있습니다 가 sybtactically 법적 XPath 식하지

//[@id='{0}'] 

(교체를 수행 한 후). 따라서 문제는 XPath 표현이 "노드를 반환하지 않음"이 아니라 구문 적으로 불법이라는 것입니다. 는 XPath W3C 규격으로 당

: 마지막 위치 단계 했으므로

/descendant-or-self::node()/[@id='{0}']

공지 :

"///descendant-or-self::node()/ 대 짧은"따라서

상기 확장된다 노드 테스트가없고 술어로 시작합니다. 이것은 XPath의 구문 규칙에 따라 불법입니다.

아마 당신은을 원하는 :

//*[@id='{0}'] 
+0

대단히 감사합니다 Dimitre, 당신은 절대적으로 정확합니다. – awj

관련 문제