2010-02-26 48 views
1

我有一个项目,需要我加载一个HTML文档作为字符串,并解析它。我试图确定哪个HTML节点会超过页面的高度(8.5x11),因此我可以在它之前插入一个'page-break-after'。这将与我正在生产的.NET DLL完成。寻找一个好的HTML解析器,将提供offsetHeight的值

我试过使用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组件,除非我别无选择。

回答

0

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

+0

不知道如果我关注。 WebBrowser是一个windows.forms类。我有一个无形的.dll。你能做这个吗?我会修补这个,但我很好奇,如果没有更好的方法? – Brett 2010-02-26 18:04:01

+0

那么你知道什么!我添加了一个带有浏览器控件的窗体,它的功能就像一个魅力。我没有看到窗口被调用时出现,所以这对我很有用!谢谢! – Brett 2010-02-26 19:16:15

+0

我在很多年前的一次单元测试中使用过它。对班级不是很确定,但很高兴它能奏效。 – 2010-02-27 03:48:48

-1

使用来自Codeplex的Html Agility Pack,它是最全面的HTML解析器,并基于HTML结构创建DOM树。

+1

我试过这个。优秀的解析器,但似乎没有任何位置属性来告诉我我在哪里与页面有关。 streamPosition可能就是它,但文档不清楚这个值是什么。 – Brett 2010-02-26 17:54:00

+0

使用典型的XPath类似结构来获取具有元素'someID'的子节点的路径... – t0mm13b 2010-02-26 18:18:33

+0

使用它...有一些瑕疵,使它在某些situtaions中无法使用。如果你的HTML很复杂,我会避免这种情况。对简单页面工作正常。 – 2010-02-27 03:49:47