HTMLAgilityPack: è necessario impostare la proprietà UseIdAttribute su true per abilitare questa funzione

c# html-agility-pack

Domanda

Sto cercando di utilizzare HTMLAgilityPack con VS2008 / .Net 3.5. Ottengo questo errore anche se imposto OptionUseIdAttribute su true, anche se dovrebbe essere vero per impostazione predefinita.

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

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

Ho provato la versione 1.4.6 e 1.4.0, né funzionava.

Versione 1.4.6 - Net20 / HtmlAgilityPack.dll

Versione 1.4.0 - Net20 / HtmlAgilityPack.dll

Questo è il codice,

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

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

Neanche questo ha funzionato,

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

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

Come posso risolvere questo problema? Grazie.

Risposta accettata

Per prima cosa ho usato ILSpy sulla Dll HAP 1.4.0. Ho navigato nella classe HtmlDocument e ho potuto vedere che il metodo GetElementById assomiglia a questo:

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

Poi ho fatto in modo che ILSpy analizzasse "_nodesid", perché nel tuo caso per qualche motivo non viene impostato. "HtmlDocument.DetectEncoding (TextReader)" e "HtmlDocument.Load (TextReader)" assegna valore a "_nodesid".

Quindi potresti provare un metodo alternativo per leggere il contenuto dall'URL in cui il valore "_nodesid" sarà assegnato ad es.

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

Questo approccio assicura che venga chiamato "HtmlDocument.Load (TextReader)", e in quel codice posso vedere che _nodesid verrà sicuramente assegnato, quindi questo approccio potrebbe (non ho compilato il codice che ho suggerito) di funzionare.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché