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";
}
}
上面的代码通过HTMLDocument的getElementsByTagName("table")方法获得所有的表格,返回一个IHTMLElementCollection类型,再通过IHTMLElementCollection的length属性循环获得每个表格。最后从每个表格行数和行内的列数单元格数组成的双循环获得每一个单元格。
运行结果如下图所示:
图23-23 获得表格内容并修改表格
23.4.3 增加网页元素
23.4.4 为网页文档和元素增加事件处理
学习更多vb.net知识,请参看vb.net 教程 目录
学习更多C#知识,请参看C#教程 目录