HTMLAgilityPack — для включения этой функции необходимо установить для свойства UseIdAttribute значение true.

Я пытаюсь использовать HTMLAgilityPack с VS2008/.Net 3.5. Я получаю эту ошибку, даже если я установил для OptionUseIdAttribute значение 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

Это код,

    HtmlWeb web = new HtmlWeb();
    HtmlDocument doc = web.Load(url);
    HtmlNode table = doc.GetElementbyId("tblThreads");

Это тоже не сработало,

    HtmlWeb web = new HtmlWeb();
    HtmlDocument doc = new HtmlDocument { OptionUseIdAttribute = true };
    doc = web.Load(url);
    HtmlNode table = doc.GetElementbyId("tblThreads");

Как я могу решить эту проблему? Спасибо.


person user471317    schedule 18.10.2013    source источник
comment
Если поставить точку останова после загрузки HtmlDocument, как будет выглядеть документ. то есть правильно загружается?   -  person Harrison    schedule 21.10.2013
comment
Да, после web.Load(url);   -  person user471317    schedule 21.10.2013
comment
Можете ли вы указать адрес?   -  person Harrison    schedule 23.10.2013
comment
Извините, это частный URL. Тот же код отлично работает на VS2010 с .Net 4.0. Но мне нужно заставить его работать над проектом VS2008.   -  person user471317    schedule 23.10.2013
comment
@ user471317, когда я ответил на ваш вопрос, вы собираетесь наградить меня наградой?   -  person Ben Smith    schedule 28.10.2013
comment
Я «принял» ваш ответ. Я предполагаю, что баллы не переходят автоматически к этому плакату? Вижу, теперь ты набрал очки.   -  person user471317    schedule 30.10.2013


Ответы (1)


Сначала я использовал ILSpy на 1.4.0 HAP Dll. Я перешел к классу 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» будет определенно назначено, например.

var doc = new HtmlDocument();
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
using (var response = (HttpWebResponse)request.GetResponse())
{
    using (var stream = response.GetResponseStream())
    {
        doc.Load(stream);
    }
}
var table = doc.GetElementbyId("tblThreads");

Этот подход гарантирует, что вызывается "HtmlDocument.Load(TextReader)", и в этом коде я вижу, что _nodesid определенно будет назначен, поэтому этот подход может (я не компилировал код, который я ве предложил) работать.

person Ben Smith    schedule 23.10.2013
comment
Без проблем. Рад, что смог помочь. - person Ben Smith; 24.10.2013