我正在使用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之后,正在删除我的关闭图像标签,这样做很好.
更新
- 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>