HtmlAgilityPack - 않습니다
웬일인지 그 자체를 닫아라?

c# html-agility-pack

문제

나는이 시험을 내가 미친 지보기 위해 썼다. ..

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HtmlAgilityPack;

namespace HtmlAgilityPackFormBug
{
    class Program
    {
        static void Main(string[] args)
        {
            var doc = new HtmlDocument();
            doc.LoadHtml(@"
<!DOCTYPE html>
<html>
    <head>
        <title>Form Test</title>
    </head>
    <body>
        <form>
            <input type=""text"" />
            <input type=""reset"" />
            <input type=""submit"" />
        </form>
    </body>
</html>
");
            var body = doc.DocumentNode.SelectSingleNode("//body");
            foreach (var node in body.ChildNodes.Where(n => n.NodeType == HtmlNodeType.Element))
                Console.WriteLine(node.XPath);
            Console.ReadLine();
        }
    }
}

그리고 출력 :

/html[1]/body[1]/form[1]
/html[1]/body[1]/input[1]
/html[1]/body[1]/input[2]
/html[1]/body[1]/input[3]

그러나 <form><xxx> 변경하면 다음과 같이 표시됩니다.

/html[1]/body[1]/xxx[1]

(그래야만). 따라서 ... <form> 즉시 닫히는 것처럼 입력 요소가 양식 내에 포함 되지 않고 본문 내에 직접있는 것처럼 보입니다. 그게 뭐야? 이거 버그 야?


근원을 파헤쳐 보면 알 수 있습니다.

ElementsFlags.Add("form", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);

META 및 IMG와 같은 "빈"플래그가 있습니다. 왜?? 양식은 반드시 비어서는 안됩니다 .

수락 된 답변

이것은 또한보고되어 이 작업 항목 . 다트 오비완에서 제안 된 해결 방법이 포함되어 있습니다.

다시 컴파일하지 않고 이것을 변경할 수 있습니다. ElementFlags 목록은 HtmlNode 클래스의 정적 속성입니다. 제거 할 수 있습니다.

    HtmlNode.ElementsFlags.Remove("form");

문서로드를하기 전에


인기 답변

내가 원래 HAP 저자이기 때문에 나는 그것이 왜 비어있는 것으로 표시되는지 설명 할 수있다 :)

HAP이 설계되었을 때, 2000 년에 HTML 3.2가 표준 이었기 때문입니다. 태그가 HTML에서 완벽하게 겹칠 수 있다는 것을 알고있을 것입니다. 즉, 모든 브라우저에서 <b>bold<i>italic and bold</b>italic</i> ( 굵은 기울임 꼴 및 굵은 기울임 꼴)을 지원합니다 (공식적으로 HTML 사양은 아님). 또한 FORM 태그도 완벽하게 겹칠 수 있습니다.

HAP은 그 당시에 발견 할 수있는 대부분의 페이지를 망가 뜨리기보다는 HTML 컨텐트를 처리하도록 설계되었으므로 ElementVlags 속성을 사용하여 겹치는 태그를 EMPTY로 처리하기로 결정했습니다.

  • 당신은 여전히 ​​그들을로드 할 수 있습니다.
  • 원래 HTML을 깨지 않고 다시 저장할 수 있습니다 (프로그래밍 방식으로 양식 안에 무엇이 필요하지 않은 경우).

사용자가 할 수없는 유일한 방법은 API를 사용하거나 트리 모델을 사용하거나 XSL 또는 프로그래밍 방식을 사용하는 것입니다. 오늘날 XHTML / XML이 거의 모든 곳에서 이상하게 들리지만 그 이유는 ElementFlags를 만든 이유입니다. :)



Related

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