DOM应用---遍历网页中的元素
2006-07-22 22:56:47 来源:WEB开发网<3> 首先取得子框架的总数目 IHTMLFramesCollection::get_length(),接着就可以循环调用 IHTMLFramesCollection::item()函数一个一个地取得子框架 IHTMLWindow2 指针,然后转第<1>步。
<4> 一个文档中可能拥有多个表单,因此还是同样的道理,先要取得表单的集合(IHTMLElementCollection,其实这个不光是表单的集合,其他元素的集合,比如图片集合也是用它)。这个操作也很简单,取得属性 IHTMLDocument2::get_forms()。
<5> 属性 IHTMLElementCollection::get_length() 得到表单总数目,就可以循环取得每一个表单指针了 IHTMLElementCollection::item()。
<6> 在第<5>步中的item()函数,得到的是一个IDispatch的指针,你通过QueryInterface()查询,就可以得到 某类型输入的指针,代码如下: // 假设 spDisp 是由IHTMLElementCollection::item() 得到的 IDispatch 指针
上面的方法,由于使用具体类型的接口指针,因此程序的效率比较高。但是通过 QueryInterface 接口查询,然后再进行条件判断显然是比较烦琐的,所以这个方法适合于特定的已知网页设计内容的程序。在示例程序中,我则是直接使用 IDispatch 接口进行操作的,这个方式执行起来稍微慢一些,但程序比较简单。主要代码和说明如下:
CComQIPtr < IHTMLInputTextElement > spInputText(spDisp);
CComQIPtr < IHTMLInputButtonElement > spInputButton(spDisp);
CComQIPtr < IHTMLInputHiddenElement > spInputHidden(spDisp);
......
if ( spInputText )
{
//如果是文本输入表单域
}
else if ( spInputButton )
{
//如果是按纽输入表单域
}
else if ( spInputHiddent )
{
//如果是隐藏输入表单域
}
else if ........ //其它输入类型#include < atlbase.h >
四、结束语
CComModule _Module; // 由于需要使用 CComDispatchDriver 的 IDispatch 包装类ATL智能指针,所以这个是必须的
#include < atlcom.h >
......
long nElemCount=0; //表单域的总数目
spFormElement->get_length( &nElemCount );
for(long j=0; j< nElemCount; j++)
{
CComDispatchDriver spInputElement; // IDispatch 的智能指针
spFormElement->item( CComVariant( j ), CComVariant(), &spInputElement );
CComVariant vName,vVal,vType; // 域名称,域值,域类型
spInputElement.GetPropertyByName( L"name", &vName );
spInputElement.GetPropertyByName( L"value",&vVal );
spInputElement.GetPropertyByName( L"type", &vType );
// 使用 IDispatch 的智能指针的好处就是:象上面这样读取、设置属性很简单
// 另外调用 Invoke 函数也异常方便,Invoke0(),Invoke1(),Invoke2()....
......
}
示例程序在 VC6 下编译执行通过。运行方法:随便启动几个 IE 浏览网页,最好是有表单输入的网页。然后执行示例的 EXE 程序即可。到这里,就到这里了......祝大家学习快乐 ^-^
更多精彩
赞助商链接