HTML Agility Pack удаляет разрыв тега закрыть - PullRequest
16 голосов
/ 05 апреля 2011

Я создаю HTML-документ, используя пакет agility 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 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

Iв конечном итоге просто прочитал в моем файле шаблона в качестве стандартной строки, а затем загрузить 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)

Ответы [ 4 ]

21 голосов
/ 05 апреля 2011

Это происходит потому, что 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>
7 голосов
/ 19 апреля 2011

Согласно @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"
2 голосов
/ 13 января 2014

Кажется, это стандартная настройка в Html Agility Pack.По умолчанию он не соответствует XHTML, и многие теги не закрываются.

Существует два способа сделать это.На уровне документа вы можете сделать следующее, что включает ВСЕ закрывающие теги.(Это мой предпочтительный метод).

HtmlDocument doc = new HtmlDocument();
doc.OptionWriteEmptyNodes = true;
doc.LoadHtml(content);

Однако это может быть нежелательно.Есть еще один способ сделать это на уровне узла.

if (HtmlNode.ElementsFlags.ContainsKey("img"))
{
    HtmlNode.ElementsFlags["img"] = HtmlElementFlag.Closed;
}
else
{
    HtmlNode.ElementsFlags.Add("img", HtmlElementFlag.Closed);
}
1 голос
/ 24 октября 2012

Я столкнулся с такой же проблемой и решил ее вручную, повторно проанализировав фрагмент HTML, используя новый объект HtmlDocument с правильными настройками.

Проблема, как я вижу, состоит в том, что HtmlDocument имеет все эти приятные настройки, позволяющие вам закрывать
теги и т. Д., Но когда вы выбираете узел или выполняете какое-то другое программное обеспечение работы с узлами и используете их OuterHtml или InnerHtml, некоторые из них закрывающие теги теряются (возможно, потому что эти свойства не используют те же настройки, что и сам документ, или, может быть, есть какая-то другая причина). Поэтому, когда вы получаете эту неверную строку html из InnerHtml или OuterHtml, вы можете просто повторно проанализировать ее с помощью HtmlDocument и использовать document.DocumentElement.InnerHtml, чтобы получить правильную строку HTML.

...