当前位置: 首页 > news >正文

23.4 MSHTML组件

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

MSHTML是微软公司的一个COM组件,该组件封装了HTML语言中的所有元素及其属性,提供了对网页HTML文档的多种接口,通过这些接口,可以访问指定网页的所有元素,实现很多高级功能。

23.4.1 引用MSHTML

在VB.Net中是不能直接使用MSHTML组件的,必须先在项目中添加对MSHTML的引用:

点击菜单【项目】|【添加引用】,在弹出的【引用管理器】左侧点击【COM】,从中间列出的所有COM组件中找到“Microsfot Html Object Library”,并勾选它前面的复选框,最后按下“确定”按钮。

图23-18 引用MSHtml组件

如果添加引用成功,那么在【解决方案资源管理器】中展开“引用”就会看到“MSHTML”了。

 

图23-19 引用“Microsfot Html Object Library”

MSHTML类似于一个命名空间,包含了大量的类、属性、方法,可以通过【对象浏览器】查看这些成员。点击菜单【视图】|【对象浏览器】,或者按下“F2”按键都可以调出【对象浏览器】窗口,然后从左侧树状列表中点开Microsoft.mshtml-mshtml查看提供的成员。

 

图23-20 使用【对象浏览器】查看

23.4.2 获得网页元素信息

MSHTML提供了丰富的接口,以HTMLDocument为例,实际在MSHtml中包括了多个相关成员:HTMLDocument、HTMLDocumentClass、IHTMLDocument、IHTMLDocument2……IHTMLDocument8(比较奇怪的是C#不能使用IHTMLDocument6-IHTMLDocument8的接口,而VB.Net可以)。除了使用HTMLDocumentClass会提示错误:当类“HTMLDocumentClass”的程序集配置为嵌入互操作类型时,不允许使用对该类的引用。也就是说这个是不能用的外,其余IHTMLDocument到IHTMLDocument5各提供了一部分HTMLDocument的属性和方法。MSHTML.HTMLDocument(这里加上MSHTML与C#自带的HTMLDocument区别)相比HtmlDocument类虽然用法类似,但是提供了更多的属性和方法。

【例 23.15【项目:code23-009】获得网页信息。

        private void btnGetInfo_Click(object sender, EventArgs e)

        {

            mshtml.HTMLDocument doc;

            doc = (mshtml.HTMLDocument)WebBrowser1.Document.DomDocument;

            txtInfo.Text = "协议:" + doc.protocol + "\r\n";

            txtInfo.Text += "状态:" + doc.readyState + "\r\n";

            txtInfo.Text += "编码:" + doc.charset + "\r\n";

            txtInfo.Text += "Cookie" + doc.cookie + "\r\n";

            txtInfo.Text += "创建日期:" + doc.fileCreatedDate + "\r\n";

            txtInfo.Text += "修改日期:" + doc.fileModifiedDate + "\r\n";

            txtInfo.Text += "文件大小:" + doc.fileSize + "\r\n";

            txtInfo.Text += "更新日期:" + doc.fileUpdatedDate + "\r\n";

            txtInfo.Text += "最后修改日期:" + doc.lastModified + "\r\n";

            txtInfo.Text += "Mime类型:" + doc.mimeType + "\r\n";

            txtInfo.Text += "文档标题:" + doc.nameProp + "\r\n";

            txtInfo.Text += "跳转来源:" + doc.referrer + "\r\n";

            txtInfo.Text += "安全证书:" + doc.security + "\r\n";

            txtInfo.Text += "文档标题:" + doc.title + "\r\n";

            txtInfo.Text += "链接地址:" + doc.url + "\r\n";

        }

运行结果如下图所示:

图23-21 使用MSHTML.HTMLDocument获得网页信息

相比23.2节和23.3节学习的HtmlDocument类和HtmlElement类,MSHTML还提供了网页元素更详细的分类,比如IHTMLScriptElement(脚本元素)、IHTMLStyleSheet(样式表)、IHTMLFormElement(表单元素)等等,这些不同的元素分类有着自己的特殊属性和方法。

【例 23.16【项目:code23-010】获得网页元素信息。

        //获得脚本信息

        private void btnScriptInfo_Click(object sender, EventArgs e)

        {

           

            txtInfo.Text = "";           

            mshtml.IHTMLDocument2 doc;

            doc = (mshtml.IHTMLDocument2)WebBrowser1.Document.DomDocument;

            mshtml.IHTMLElementCollection scrs = doc.scripts;

            mshtml.IHTMLScriptElement scr;

            for(int i  = 0;i< scrs.length;i++)

            {

                scr = (mshtml.IHTMLScriptElement)scrs.item(i);

                txtInfo.Text += scr.text + "\r\n";

                txtInfo.Text += "====================" + "\r\n";

            }

        }

        //获得表单信息

        private void btnFormInfo_Click(object sender, EventArgs e)

        {

            txtInfo.Text = "";

            mshtml.HTMLDocument doc = (mshtml.HTMLDocument)WebBrowser1.Document.DomDocument;

            mshtml.IHTMLElementCollection eles = (mshtml.IHTMLElementCollection)doc.forms;

            mshtml.IHTMLFormElement frm;

            for(int i = 0;i< eles.length;i++)

            {

                frm = (mshtml.IHTMLFormElement)eles.item(i);

                txtInfo.Text += "action:" + frm.action + "\r\n";

                txtInfo.Text += "encoding:" + frm.encoding + "\r\n";

                txtInfo.Text += "method:" + frm.method + "\r\n";

                txtInfo.Text += "name:" + frm.name + "\r\n";

                txtInfo.Text += "target:" + frm.target + "\r\n";

                txtInfo.Text += "====================" + "\r\n";

            }

        }

        //获得样式表信息

        private void btnStyleInfo_Click(object sender, EventArgs e)

        {

            txtInfo.Text = "";

            mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)WebBrowser1.Document.DomDocument;

            mshtml.HTMLStyleSheetsCollection styles = doc.styleSheets;

            mshtml.IHTMLStyleSheet style;

            for (int i = 0; i < styles.length; i++)

            {

                try

                {

                    style = (mshtml.IHTMLStyleSheet)styles.item(i);

                    txtInfo.Text += style.cssText + "\r\n";

                    txtInfo.Text += "====================" + "\r\n";

                }

                catch (Exception ex)

                {

                    //

                }

            }

        }

运行结果如下图所示:

图23-22 使用MSHTML获得表单信息

【例 23.17【项目:code23-011】获得表格的内容。

        private void btnGetInfo_Click(object sender, EventArgs e)

        {

            mshtml.HTMLDocument doc = (mshtml.HTMLDocument)WebBrowser1.Document.DomDocument;

            mshtml.IHTMLElementCollection tabs = doc.getElementsByTagName("table");

            //循环分析每个表格

            for(int k = 0;k< tabs.length;k++)

            {

                mshtml.HTMLTable tab = tabs.item(k);

                //设置表格背景色

                tab.bgColor = "#D8D8CC";

                //设置表格边框大小

                tab.border = 2;

                //设置表格边框颜色

                tab.borderColor = "#ffff00";

                //表格行数

                int rowCount = tab.rows.length;

                for(int i  = 0;i< rowCount;i++)

                {

                     mshtml.HTMLTableRow myrow = tab.rows.item(i);

                    //表格某行的单元格数

                    int cellCount;

                    cellCount = myrow.cells.length;

                    //两个循环获得单元格中的Html代码

                    for(int j = 0;j< cellCount;j++)

                    {

                        mshtml.HTMLTableCell mycell;

                        mycell = myrow.cells.item(j);

                        txtInfo.Text += mycell.innerHTML + " ";

                        //如果单元格文本是我们需要的,那么修改它

                        if (mycell.innerText == "输入学生姓名:")

                            mycell.innerText = "修改学生姓名:";

                    }

                    txtInfo.Text += "\r\n";

                }

                txtInfo.Text += "===============" + "\r\n";

            }

        }

上面的代码通过HTMLDocumentgetElementsByTagName("table")方法获得所有的表格,返回一个IHTMLElementCollection类型,再通过IHTMLElementCollectionlength属性循环获得每个表格。最后从每个表格行数和行内的列数单元格数组成的双循环获得每一个单元格。

运行结果如下图所示:

图23-23 获得表格内容并修改表格

23.4.3 增加网页元素

23.4.4 为网页文档和元素增加事件处理

学习更多vb.net知识,请参看vb.net 教程 目录

学习更多C#知识,请参看C#教程 目录

相关文章:

  • pycharm 调试 debug 进入 remote_sources
  • C/C++高性能Web开发框架全解析:2025技术选型指南
  • CompletableFuture 使用和源码解读
  • JAVA版本游戏进程读写操作
  • Java 大视界 -- 国际竞争与合作:Java 大数据在全球市场的机遇与挑战(94)
  • 网络安全运维服务手册 运维网络安全相关知识
  • hot100_70. 爬楼梯
  • MTK-Android13-包安装器PackageInstaller 静默安装实现
  • Python之装饰器三 踩坑(带参数,不带参数,两者都带参数)
  • SpringBoot线程池的使用
  • QML 实现一个动态的启动界面
  • Apipost和Apifox如何选型(1):WebSocket调试
  • 【Elasticsearch】多索引(数据流)搜索
  • conda 配置源
  • CSDN违禁词与规避(CSDN社区专属)
  • 零基础学QT、C++(四)QT程序打包
  • 利用Linux技能处理访问升级
  • UE_C++ —— Container TSet
  • AIGC视频扩散模型新星:SVD——稳定扩散的Video模型
  • 服务保护和分布式事务
  • 特朗普与普京开始电话会谈,稍后将致电泽连斯基
  • 瑞幸首度牵手成都国际非遗节,用一杯饮品将非遗之美推向全国
  • 国家主席习近平任免驻外大使
  • 女排奥运冠军宋妮娜:青少年保持身心健康才能走得更远
  • 101岁陕西省军区原司令员冀廷璧逝世,曾参加百团大战
  • 首次带人形机器人走科技节红毯,傅利叶顾捷:机器人行业没包袱,很多事都能从零开始