Я создаю 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
мои закрывающие теги изображений, после добавления doc.OptionWriteEmptyNodes = True
, он это делает.
Обновить
Это мой код, поскольку он стоит сейчас, что удаляет закрывающий тег BR
Dim html As String = "Words<br/>more words"
Dim doc As New HtmlDocument()
Dim title As HtmlNode
Dim topContent As HtmlNode
HtmlNode.ElementsFlags("br") = HtmlElementFlag.Empty
doc.Load(Server.MapPath("Template.htm"))
Title = doc.DocumentNode.SelectSingleNode("//title")
title.InnerHtml = title.InnerHtml & "CEU Classes"
topContent = doc.GetElementbyId("topContent")
topContent.InnerHtml = html.ToString
doc.OptionWriteEmptyNodes = True
doc.Save(outputFileName, Encoding.UTF8)
Обновление 2
Я закончил тем, что просто прочитал в своем файле шаблона стандартную строку, а затем загрузил html, как это
Dim TemplateHTML As String = File.ReadAllText(Server.MapPath("Template.htm"))
TemplateHTML = TemplateHTML.Insert(TemplateHTML.IndexOf("<div id=""topContent"">") + "<div id=""topContent"">".Length, _
html.ToString)
doc.LoadHtml(TemplateHTML)
Это происходит потому, что Html Agility Pack обрабатывает BR особым образом. Он по-прежнему поддерживает старый (но существующий в Интернете сегодня) синтаксис 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)
который отобразит:
<test>before<br />after</test>
Согласно @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
"Lorem ipsum dolor sit<br />Lorem ipsum dolor sit"