HTML 민첩성 팩은 중단 태그 닫기를 제거합니다.

asp.net html-agility-pack vb.net

문제

HTML 민첩성 팩을 사용하여 HTML 문서를 만듭니다. 템플릿 파일을로드 한 다음 템플릿 파일에 내용을 추가합니다. 이 모든 작동하지만 출력 파일을 볼 때 내에서 닫는 태그를 제거했습니다 <br/> 같이하는 태그 <br> . 이 원인은 무엇입니까?

Dim doc As New HtmlDocument()
doc.Load(Server.MapPath("Template.htm"))

Dim title As HtmlNode = doc.DocumentNode.SelectSingleNode("//title")

title.InnerHtml = title.InnerHtml & "CEU Classes"
Dim topContent As HtmlAgilityPack.HtmlNode = doc.GetElementbyId("topContent")

topContent.InnerHtml = html.ToString
doc.OptionWriteEmptyNodes = True
doc.Save(outputFileName, Encoding.UTF8)

더 많은 정보:

doc.OptionWriteEmptyNodes = True 추가하고 나면 닫는 이미지 태그가 제거되었습니다.

최신 정보

이것은 현재 내 코드로서 닫는 BR 태그를 제거합니다.

Dim doc As New HtmlDocument()
doc.Load(Server.MapPath("Template.htm"))

Dim title As HtmlNode = doc.DocumentNode.SelectSingleNode("//title")

title.InnerHtml = title.InnerHtml & "CEU Classes"
Dim topContent As HtmlAgilityPack.HtmlNode = doc.GetElementbyId("topContent")

topContent.InnerHtml = html.ToString
doc.OptionWriteEmptyNodes = True
doc.Save(outputFileName, Encoding.UTF8)

업데이트 2

나는 표준 템플릿으로 내 템플릿 파일을 읽는 것을 끝내고 다음과 같이 html을로드했다.

Dim doc As New HtmlDocument()
doc.Load(Server.MapPath("Template.htm"))

Dim title As HtmlNode = doc.DocumentNode.SelectSingleNode("//title")

title.InnerHtml = title.InnerHtml & "CEU Classes"
Dim topContent As HtmlAgilityPack.HtmlNode = doc.GetElementbyId("topContent")

topContent.InnerHtml = html.ToString
doc.OptionWriteEmptyNodes = True
doc.Save(outputFileName, Encoding.UTF8)

수락 된 답변

그것은 Html Agility Pack이 BR을 특별한 방식으로 처리하기 때문에 발생합니다. 그것은 여전히 ​​HTML (웹에 존재하는) HTML 3.2 구문을 지원합니다. BR은 닫는 태그없이 선언 될 수 있습니다 (브라우저는 여전히 그 방식으로 우아하게 처리합니다 ...).

이 기본 동작을 변경하려면 다음과 같이 HtmlNode.ElementFlags 속성을 수정해야합니다.

Dim doc As New HtmlDocument()
HtmlNode.ElementsFlags("br") = HtmlElementFlag.Empty
doc.LoadHtml("<test>before<br/>after</test>")
doc.OptionWriteEmptyNodes = True   
doc.Save(Console.Out)

그러면 다음과 같이 표시됩니다.

Dim doc As New HtmlDocument()
HtmlNode.ElementsFlags("br") = HtmlElementFlag.Empty
doc.LoadHtml("<test>before<br/>after</test>")
doc.OptionWriteEmptyNodes = True   
doc.Save(Console.Out)

인기 답변

@Simon Mourier에 따르면 다음 C # 코드는 버전 1.4에서 작동합니다.

var doc = new HtmlDocument();
HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Empty;
doc.OptionWriteEmptyNodes = true;
doc.LoadHtml("Lorem ipsum dolor sit<br/>Lorem ipsum dolor sit");

var postParsed = doc.DocumentNode.WriteTo();

postParsed에 대해 다음 문자열 값을가집니다.

var doc = new HtmlDocument();
HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Empty;
doc.OptionWriteEmptyNodes = true;
doc.LoadHtml("Lorem ipsum dolor sit<br/>Lorem ipsum dolor sit");

var postParsed = doc.DocumentNode.WriteTo();



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