HtmlAgilityPack은 옵션 끝 태그를 삭제합니다.

html html-agility-pack parsing

문제

HtmlAgilityPack을 사용하고 있습니다. 다음 문자열을 사용하여 HtmlDocument 및 LoadHtml을 만듭니다.

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select>

이것은 예상치 못한 일을합니다. 먼저 두 개의 파서 오류 EndTagNotRequired를 제공합니다. 둘째, 선택 노드에는 옵션 태그의 경우 2 개와 옵션 태그의 내부 텍스트의 경우 2 개의 자식이 있습니다. 마지막으로, OuterHtml은 다음과 같습니다.

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select>

그래서 기본적으로 옵션에 닫기 태그를 놓기로 결정합니다. 그것을하는 것이 적절하고 바람직한지 여부를 잠시 떠나 둡시다. HTML 생성 코드를 테스트하기 위해 HtmlAgilityPack을 사용하고 있습니다. 따라서 HTML이 정말로 잘못된 형식이 아니라면 어떤 결정을 내리지 않거나 오류를주지 않기를 바랍니다. 내가 원하는 방식으로 행동하게하는 방법이 있습니까? HtmlDocument에 대한 옵션 중 일부를 설정하려고 시도했습니다. 구체적으로 다음과 같습니다.

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select>

이것은 작동하지 않습니다. HtmlAgilityPack이 내가 원하는 것을 할 수 없다면, 할 수있는 것을 권유 할 수 있습니까?

수락 된 답변

HAP 홈 페이지의 토론에서 똑같은 오류가보고되었지만 몇 년 안에 프로젝트에 의미있는 수정이 없었던 것처럼 보입니다. 별로 고무하지 않습니다.

소스를 빠르게 탐색하면 HtmlNode.cs의 92 행을 주석 처리하여 오류를 수정할 수 있음을 알 수 있습니다.

// they sometimes contain, and sometimes they don 't...
ElementsFlags.Add("option", HtmlElementFlag.Empty);

실제로 빈 문자열은 유효한 텍스트 일지라도 항상 레이블 텍스트를 포함하고 있습니다. 부주의 한 작성자는 종료 태그를 생략 할 수 있지만 요소는 사실입니다.

더하다

동일한 해결책은 HtmlNode.ElementsFlags.Remove("option"); 호출하는 것입니다 HtmlNode.ElementsFlags.Remove("option"); 자유 주의자를 사용하기 전에 (자유 소스 코드를 수정할 필요가 없음)


인기 답변

XHTML 준수를 위해 옵션 태그를 "일반"태그로 구문 분석하지 않는 몇 가지 이유가 있지만 이는 목에 통증이 될 수 있습니다.

내 제안은 전체 문자열 교체를 수행하고 모든 "옵션"태그를 "my_option"태그로 변경하는 것입니다.

  1. 라이브러리의 소스를 수정할 필요가 없습니다 (나중에 업그레이드 할 수 있음).
  2. 평소처럼 분석 할 수 있습니다.

HtmlAgilityPack 포럼의 원본 게시물은 다음에서 찾을 수 있습니다. http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.