在 WinForms 中嵌入 WebBrowser 控制項(基於 MSHTML),載入網頁後走訪 DOM 節點,動態建立 TreeView 顯示 HTML 文件結構。
using System;
using System.Windows.Forms;
using mshtml; // 參考 COM: "Microsoft HTML Object Library"
public class DomTreeBuilder
{
private readonly TreeView _treeView;
private readonly WebBrowser _browser;
public DomTreeBuilder(TreeView treeView, WebBrowser browser)
{
_treeView = treeView;
_browser = browser;
_browser.DocumentCompleted += Browser_DocumentCompleted;
}
private void Browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url != _browser.Url) return; // 僅處理主框架完成
_treeView.Nodes.Clear();
IHTMLDocument3 doc = (IHTMLDocument3)_browser.Document.DomDocument;
IHTMLDOMNode rootNode = (IHTMLDOMNode)doc.documentElement;
TreeNode root = _treeView.Nodes.Add("HTML");
InsertDomNodes(rootNode, root);
root.ExpandAll();
}
private void InsertDomNodes(IHTMLDOMNode parentNode, TreeNode parentTreeNode)
{
if (!parentNode.hasChildNodes()) return;
IHTMLDOMChildrenCollection children = (IHTMLDOMChildrenCollection)parentNode.childNodes;
int len = children.length;
for (int i = 0; i < len; i++)
{
IHTMLDOMNode child = (IHTMLDOMNode)children.item(i);
TreeNode node = parentTreeNode.Nodes.Add(child.nodeName);
InsertDomNodes(child, node); // 遞迴處理子節點
}
}
}
| 介面 | 用途 |
|---|---|
IHTMLDocument3 | HTML 文件根介面,提供 documentElement 取得 <html> 根節點。 |
IHTMLDOMNode | DOM 節點基底,含 nodeName、childNodes、hasChildNodes()。 |
IHTMLDOMChildrenCollection | 子節點集合,支援 length 與 item(index) 索引存取。 |
SHDocVw),拖曳 WebBrowser 到表單。mshtml)。WebBrowser 的 DocumentCompleted 事件連接上述處理函式。DocumentCompleted 會觸發多次(每個 iframe),需判斷 e.Url == browser.Url 僅處理主文件。DocumentCompleted,需搭配 Timer 輪詢或注入 JS 回呼通知。Marshal.ReleaseComObject 或啟用 GC.Collect()。HtmlAgilityPack 或 AngleSharp 純 managed 解析器,不相依 IE/Edge WebView。