2010-02-26 38 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