寻找一个好的HTML解析器,它将提供与offsetHeight类似的值

时间:2010-02-26 17:07:18

标签: .net html mshtml

我有一个项目要求我将HTML文档作为字符串加载,并解析它。我试图确定哪个HTML节点将超过页面的高度(8.5x11),所以我可以在它之前插入'page-break-after'。这将通过我正在生成的.NET DLL完成。

我尝试过使用mshtml dom。将字符串值加载到此中并不容易,当我设法完成此操作时,offsetHeight(etc)属性始终返回零。我发现这项工作的唯一方法是将HTML保存到磁盘,通过SHDocVw.InternetExplorer加载它,然后将其传递给mshtml dom。

我假设除非HTML被SHDocVw“渲染”,否则我没有要报告的mshtml的offsetHeight信息,因为这是基于屏幕像素的。我错了。

我目前的代码如下:

Dim myIE As New SHDocVw.InternetExplorer
myIE.Navigate("D:\Temp\Test.HTML")
Dim myDoc As mshtml.HTMLDocument = CType(myIE.Document, mshtml.HTMLDocument)

Dim divTag As mshtml.IHTMLElement = myDoc.getElementById("someID")

For Each childNode As mshtml.IHTMLElement In TryCast(divTag.children, mshtml.IHTMLElementCollection)
    If childNode.offsetTop + childNode.offsetHeight > 750 Then '72pixels = 1 inch.
         childNode.insertAdjacentHTML("beforeBegin", "<DIV style='page-break-after:always'></DIV>") 
    End If
Next

我有两个目标。 #1是关键,#2理想。

1)从字符串加载HTML,并使上述代码仍然有效。

2)理想情况下,找一个可以做同样事情的.NET组件。除非我别无选择,否则我不喜欢依赖.NET中的COM组件。

2 个答案:

答案 0 :(得分:0)

WebBrowser(可能,不确定)将获取您的HTML字符串并将其转换为可导航的DOM。重用,不要重新发明HTML解析器。在项目结束时你会留下更多的头发。

答案 1 :(得分:-1)

使用Codeplex中的Html Agility Pack,这是HTML最彻底的解析器,并根据HTML结构创建DOM树。