我正在使用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 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)
答案 0 :(得分:21)
这是因为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>
答案 1 :(得分:7)
根据@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 :(得分:2)
似乎这是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);
}
答案 3 :(得分:1)
我遇到了同样的问题,我通过使用具有正确设置的新HtmlDocument对象手动重新解析HTML块来解决它。
问题,因为我看到HtmlDocument有所有那些不错的设置让你关闭标签等,但当你选择一个节点或做一些其他软操作与节点并使用他们的OuterHtml或InnerHtml一些那些结束标签丢失(可能是因为这些属性不使用与文档本身相同的设置,或者meybe还有其他原因)。因此,当您从InnerHtml或OuterHtml获取不正确的html字符串时,您可以再次使用HtmlDocument重新解析它并使用document.DocumentElement.InnerHtml
来获取正确的HTML字符串。