HTMLAgilityPack - 您需要將UseIdAttribute屬性設置為true才能啟用此功能

c# html-agility-pack

我正在嘗試將HTMLAgilityPack與VS2008 / .Net 3.5一起使用。即使我將OptionUseIdAttribute設置為true,我也會收到此錯誤,但默認情況下它應該為true。

Error Message:
 You need to set UseIdAttribute property to true to enable this feature

Stack Trace:
    at HtmlAgilityPack.HtmlDocument.GetElementbyId(String id)

我嘗試了1.4.6和1.4.0版,但都沒有用。

版本1.4.6 - Net20 / HtmlAgilityPack.dll

版本1.4.0 - Net20 / HtmlAgilityPack.dll

這是代碼,

Error Message:
 You need to set UseIdAttribute property to true to enable this feature

Stack Trace:
    at HtmlAgilityPack.HtmlDocument.GetElementbyId(String id)

這也不起作用,

Error Message:
 You need to set UseIdAttribute property to true to enable this feature

Stack Trace:
    at HtmlAgilityPack.HtmlDocument.GetElementbyId(String id)

我該如何解決這個問題?謝謝。

一般承認的答案

首先我在1.4.0 HAP Dll上使用了ILSpy 。我導航到HtmlDocument類,可以看到GetElementById方法如下所示:

// HtmlAgilityPack.HtmlDocument
/// <summary>
/// Gets the HTML node with the specified 'id' attribute value.
/// </summary>
/// <param name="id">The attribute id to match. May not be null.</param>
/// <returns>The HTML node with the matching id or null if not found.</returns>
public HtmlNode GetElementbyId(string id)
{
    if (id == null)
    {
        throw new ArgumentNullException("id");
    }
    if (this._nodesid == null)
    {
        throw new Exception(HtmlDocument.HtmlExceptionUseIdAttributeFalse);
    }
    return this._nodesid[id.ToLower()] as HtmlNode;
}

然後我讓ILSpy分析“_nodesid”,因為在你的情況下由於某種原因它沒有被設置。 “HtmlDocument.DetectEncoding(TextReader)”和“HtmlDocument.Load(TextReader)”將值賦給“_nodesid”。

因此,您可以嘗試另一種方法來從URL中讀取內容,從而明確分配“_nodesid”值,例如

// HtmlAgilityPack.HtmlDocument
/// <summary>
/// Gets the HTML node with the specified 'id' attribute value.
/// </summary>
/// <param name="id">The attribute id to match. May not be null.</param>
/// <returns>The HTML node with the matching id or null if not found.</returns>
public HtmlNode GetElementbyId(string id)
{
    if (id == null)
    {
        throw new ArgumentNullException("id");
    }
    if (this._nodesid == null)
    {
        throw new Exception(HtmlDocument.HtmlExceptionUseIdAttributeFalse);
    }
    return this._nodesid[id.ToLower()] as HtmlNode;
}

這種方法確保調用“HtmlDocument.Load(TextReader)”,並且在該代碼中我可以看到_nodesid肯定會被分配,所以這種方法可能 (我沒有編譯我建議的代碼)工作。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因