使用HTML Agility Pack遍歷DOM

c# html-agility-pack

我無法弄清楚如何使用HTML Agility Pack遍歷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;

現在我正在做這個(上面),但是foo出現為null 。我究竟做錯了什麼?

編輯:這是我正在使用的if語句。我只是測試看看InnerText元素是否等於“谷歌搜索”。

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

一般承認的答案

你應該做的是:

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

您忘記FirstOrDefault()以選擇滿足條件的第一個元素where

並且我替換了Attributes["id"].Value GetAttributeValue("id", null)如果元素具有id屬性則不拋出異常。


熱門答案

我不認為foo會以null 。更可能的是, bar.Attributes["id"]對於樹中的某些元素為空,因為並非所有後代節點都具有“id”屬性。我建議使用GetAttributeValue方法,如果找不到該屬性,該方法將返回默認值。

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


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow