2010-11-03 82 views
6

所有我想要做的就是HtmlAgilityPack HasAttribute?

node.Attributes["class"].Value 

但如果節點不具有class屬性,它崩潰。所以,我必須先檢查它的存在,對嗎?我怎麼做? Attributes不是一個字典(它是一個包含內部字典的列表??),並且沒有HasAttribute方法(只是一個HasAttributes,它指示它是否有任何屬性)。我該怎麼辦?

+2

你確定檢查node.Attributes [「class」]'不返回null嗎? – 2010-11-03 18:15:23

+0

@Kirk:對,你是......認爲它由於某種原因拋出異常。好決定。 – mpen 2010-11-03 18:19:38

回答

13

試試這個:

String val; 
if(node.Attributes["class"] != null) 
{ 
    val = node.Attributes["class"].Value; 
} 

,或者您可能能夠添加這個

public static class HtmlAgilityExtender 
{ 
    public static String ValueOrDefault(this HtmlAttribute attr) 
    { 
     return (attr != null) ? attr.Value : String.Empty; 
    } 
} 

然後用

node.Attributes["class"].ValueOrDefault(); 

我還沒有測試的那一個,但它應該工作。

+0

不能在單行'if'聲明... – 2010-11-03 18:17:09

+0

呵呵,謝謝你清醒聲明一個變量,所以我沒有:-) – 2010-11-03 18:18:49

+0

希望,他們將實施類似 VAL = node.Attributes [「class」]。值「」;如果你只是不關心任何地方空... – Doggett 2010-11-03 18:24:25

3

請試試這個:

String abc = String.Empty;  
     if (tag.Attributes.Contains(@"type")) 
     { 
      abc = tag.Attributes[@"type"].Value; 
     } 
0

該代碼可以用來獲得兩個腳本標記之間的所有文本。

String getURL(){ 
return @"some site address"; 
} 
List<string> Internalscripts() 
    { 
     HtmlAgilityPack.HtmlDocument doc = new HtmlWeb().Load((@"" + getURL())); 
     //Getting All the JavaScript in List 
     HtmlNodeCollection javascripts = doc.DocumentNode.SelectNodes("//script"); 
     List<string> scriptTags = new List<string>(); 
     foreach (HtmlNode script in javascripts) 
     { 
      if(!script.Attributes.Contains(@"src")) 
      { 
       scriptTags.Add(script.InnerHtml); 
      } 
     } 
     return scriptTags; 
    }