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

何らかの理由であなたのケースで設定されていないので、私は "_nodesid"を分析するためにILSpyを取得しました。 "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は合法ですか? はい、理由を学ぶ