2013-08-07 112 views
2

我的應用程序使用HtmlAgilityPack下載HTML文檔並使用大量XPath查詢分析它們的DOM結構。免責聲明:XPath支持對我而言非常重要,例如,我無法切換到CSS選擇器。這是我使用HtmlAgilityPack的主要原因(也可能是唯一原因)。如何獲取C#中的HTMLAgilityPack DOM元素的邊界框?

我有一個HtmlAgilityPack.HtmlNode,從一些XPath查詢HTML文檔選擇。現在我需要實現一個額外的方法:如果這個元素由某個引擎渲染,那麼這個元素的邊界框座標是什麼?我甚至不關心哪個特定的發動機使用,讓它成爲WebKit的,MSIE,蛤蚧/火狐等我只是需要一種方法來:

  1. 渲染內存中的文件的任意大小的畫布上(比如說,1900 * 1200像素)。
  2. 設置渲染器的DOM樹,我已經有HtmlAgilityPack.HtmlDocument之間有一個一一對應。
  3. 向渲染器用於此帆布在一個特定的DOM元素(HtmlAgilityPack.HtmlNode)的邊界框。

我已經花了半天的時間去研究.NET的各種HTML呈現引擎,但仍然沒有找到辦法做到這一點。也許有人已經解決了類似的問題?感謝您的任何幫助。

+0

[Awesomium(http://awesomium.com/)看起來是這個工作在合適的工具。 – Noseratio

+0

@Noseratio我試過Awesomium。我沒有找到一種方法去做#3。 – Skiminok

+1

#3並不特定於Awesomium。如果所需的HTML元素沒有'id'屬性,則生成一個唯一的ID並將其分配給具有HTML Agility Pack的元素。如果有'id',請使用它(確保它是唯一的)。將文檔加載到HTML引擎中,然後執行'document.getElementById(id).getBoundingClientRect()'。 Awesomium和WebBrowser控件都提供綁定來訪問DOM。 – Noseratio

回答

2

你可以嘗試添加自定義屬性。然後在WebBrowser控件中找到它。
類似於this

+0

嗯。有沒有辦法更有效地搜索WebBrowser中的標記元素?一直枚舉整個樹看起來很昂貴。 – Skiminok

+0

您可以先查找所有getElementsByTagName。 –

+1

@Skiminok,它是一個單一的'HtmlNode'或許多一個文件? DOM樹遍歷與實際加載相差無幾,WebBrowser(或其他任何HTML引擎)解析和呈現文檔。 – Noseratio

相關問題