HTMLAgilityPack - Vous devez définir la propriété UseIdAttribute sur true pour activer cette fonctionnalité.

c# html-agility-pack

Question

J'essaie d'utiliser HTMLAgilityPack avec VS2008 / .Net 3.5. J'obtiens cette erreur même si je règle l'option OptionUseIdAttribute sur true, bien qu'elle soit supposée être vraie par défaut

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

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

J'ai essayé les versions 1.4.6 et 1.4.0, mais aucune n'a fonctionné.

Version 1.4.6 - Net20 / HtmlAgilityPack.dll

Version 1.4.0 - Net20 / HtmlAgilityPack.dll

C'est le code,

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

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

Cela n'a pas fonctionné non plus,

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

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

Comment puis-je résoudre ce problème? Merci.

Réponse acceptée

J'ai d'abord utilisé ILSpy sur la DLL 5.1 HAP. J'ai navigué jusqu'à la classe HtmlDocument et j'ai pu voir que la méthode GetElementById ressemblait à ceci:

// 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;
}

J'ai ensuite demandé à ILSpy d'analyser "_nodesid", car dans votre cas, pour une raison quelconque, il n'est pas défini. "HtmlDocument.DetectEncoding (TextReader)" et "HtmlDocument.Load (TextReader)" attribue une valeur à "_nodesid".

Par conséquent, vous pouvez essayer une autre méthode pour lire le contenu à partir de l'URL, la valeur "_nodesid" étant définitivement attribuée, par exemple

// 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;
}

Cette approche garantit que "HtmlDocument.Load (TextReader)" est appelé, et dans ce code, je peux voir que _nodesid sera définitivement attribué. Cette approche peut donc (je n'ai pas compilé le code que j'ai suggéré) fonctionner.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi