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는 합법적입니까? 예, 이유를 알아보십시오.