首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 使用 MSHTML 解析 HTML 並產生 DOM 樹狀結構

     編輯:關於C語言

需求

在 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); // 遞迴處理子節點
        }
    }
}

關鍵介面說明

介面用途
IHTMLDocument3HTML 文件根介面,提供 documentElement 取得 <html> 根節點。
IHTMLDOMNodeDOM 節點基底,含 nodeName、childNodes、hasChildNodes()。
IHTMLDOMChildrenCollection子節點集合,支援 length 與 item(index) 索引存取。

專案設定步驟

  1. 工具箱 → 選擇項目 → COM 元件 → 勾選 Microsoft Web Browser(SHDocVw),拖曳 WebBrowser 到表單。
  2. 專案 → 加入參考 → COM → 勾選 Microsoft HTML Object Library(mshtml)。
  3. 將 WebBrowser 的 DocumentCompleted 事件連接上述處理函式。

注意事項

  • 框架頁面:DocumentCompleted 會觸發多次(每個 iframe),需判斷 e.Url == browser.Url 僅處理主文件。
  • 動態內容:AJAX 載入的內容不會觸發 DocumentCompleted,需搭配 Timer 輪詢或注入 JS 回呼通知。
  • 記憶體釋放:MSHTML 為 COM 物件,大量節點走訪後建議呼叫 Marshal.ReleaseComObject 或啟用 GC.Collect()。
  • 現代替代方案:.NET Core / 5+ 建議使用 HtmlAgilityPack 或 AngleSharp 純 managed 解析器,不相依 IE/Edge WebView。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved