2013-07-24 3 views
0

HTML 민첩성 팩으로 DOM을 트래버스하는 방법을 알아 내는데 어려움이 있습니다.HTML 민첩성 팩으로 DOM 트래버스

예를 들어 id="gbqfsa" 인 요소를 찾고 싶다고합시다.

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
      doc.LoadHtml(Url); 
      var foo = from bar in doc.DocumentNode.DescendantNodes() 
          where bar.Attributes["id"].Value == "gbqfsa" 
          select bar.InnerText; 

는 지금은이 (위)하고있어,하지만 foonull로 나오고있다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

편집 : 이것은 내가 사용하고있는 if 문입니다. 나는 단지 InnerText 요소가 "Google 검색"과 같은지 테스트 해 보았습니다.

if (foo.Equals("Google Search")) 
      { 
       HasSucceeded = 1; 
       MessageBox.Show(yay); 
      } 
      else 
      { 
       MessageBox.Show("kms"); 
      } 
      return HasSucceeded; 
+0

var'foo = ...'가 실행되면'foo'는'null' 될 수 없습니다. 빈 콜렉션이 될 수는 있지만'null '이 될 수는 없습니다. –

+0

좋아요. 코드를 따라 가면 null이라고 말합니다. 어떤 생각을 내가 뭘 잘못하고있어? –

+0

작동하지 않는 URL 및 요소 ID의 예를 들어 주시겠습니까? –

답변

1

당신이해야 할 것은 :

var foo = (from bar in doc.DocumentNode.DescendantNodes() 
      where bar.GetAttributeValue("id", null) == "gbqfsa" 
      select bar.InnerText).FirstOrDefault(); 

당신은 where의 조건을 만족하는 첫 번째 요소를 선택 FirstOrDefault()를 잊어 버렸습니다.

그리고 요소에 id 특성이있는 경우 예외를 throw하지 않으려면 Attributes["id"].ValueGetAttributeValue("id", null)으로 바꿉니다.

+0

빠른 측면에서, 만약'if' 문에서 요소가 존재하는지 어떻게 테스트 할 수 있습니까? –

+0

요소가 없으면 'foo == null' (감사합니다 [FirstOrDefault()] (http://msdn.microsoft.com/en-us/library/system.linq.enumerable.firstordefault.aspx)) –

+0

예 'foo == null'이'true'로 나오고 있습니다. 어떤 병이든 그것을 파악하십시오. 도와 주셔서 감사합니다. –

1

나는 foonull으로 나오는 생각하지 않습니다. 모든 하위 노드에 "id"속성이있는 것은 아니므로 bar.Attributes["id"]이 트리의 일부 요소에 대해 null입니다. GetAttributeValue 메서드를 사용하는 것이 좋습니다.이 메서드는 특성을 찾을 수없는 경우 기본값을 반환합니다.

var foo = from bar in doc.DocumentNode.DescendantNodes() 
      where bar.GetAttributeValue("id", null) == "gbqfsa" 
      select bar.InnerText;