求高人,IHTMLElement如何获得元素的Attribute值

Afterwards_ 2012-08-05 07:12:30
IHTMLElement::getAttribute可以么?
网页代码如下
<a class="J_MemoFlag memo-flag" data-orderid="149725257706392" target="_blank" href="网页地址" title="" data-spm-anchor-id="a1z09.1.11.6" data="暂时没有备忘信息">
</a>

比如获取 data-orderid的值 target的值 data的值 以及 anchor-id 的值 等等
...全文
905 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
DrSmart 2012-09-28
  • 打赏
  • 举报
回复
楼主不是牛逼,是结帖率异常的高,116%什么情况
傻X 2012-08-06
  • 打赏
  • 举报
回复
楼主非常不错,懂得分享,还写经验帖,赞一个。
Gloveing 2012-08-06
  • 打赏
  • 举报
回复
LZ 牛X
Afterwards_ 2012-08-05
  • 打赏
  • 举报
回复
自己搞定了

按照如上的网页代码,首先,使用IID_IHTMLElementCollection集合的指针对像,先得到一个指定类型的元素数目,然后进入一个for循环,遍历所有IHTMLElement,遍历方式为
pEleColTags->item(CComVariant(i), CComVariant(), &pDistmp);

i为循环的自增变量,
这里值得一提的是,item函数并不是一定要填写的像他的参数说明一样,他让写的是VARIANT类型的name 实际上我们可以填入数字 以此来告知他查找item的方式是按照序号来查找.而不是一定要填写HTML源码中的name=XXX的这个name

新手注意 虽然我也是新手.

以上可以得到这个关于 <a> 标签的集合
然后用IID_IHTMLElementCollection的标签集指针对象,得到这个集合内元素的数目,然后便利一次他们的class名称.也就是用 IHTMLElement的get_classname,其实这一步可以省去,只是在我们debug跟踪的时候,方便找到所需要的信息.否则便利整个集合,是很麻烦的.

我们得到的这个类的名称以后 就可以调用IHTMLElement的get_outerHTML来跟踪一下你的网页源码了.
为什么要做这一步,是因为有的时候你通过浏览器或者其他工具获取的网页元素或代码 不一定准确.
本段代码中 我们提到的 data="暂时没有备忘信息" 实际上就是在outerHTML里面得不到的.所以我们有必要通过得到的网页代码看一下IHTMLElement所能识别到的元素.

筛选完以后 我们就可以根据getAttribute来获得指定属性的值了.
之前我就是在这里遇到的问题,CSDN也看到了同样的问题的朋友.说一直返回的都是NULL
查阅google英文站,看到很多外国编程者也遇到了同样问题,其实这里是我们忽略了一个细节,那就是给VARIANT 做一个初始化
VARIANT vtValue;


vtValue.bstrVal = SysAllocString(NULL);
vtValue.vt = VT_BSTR;

如不做此步骤,指针错误,类型错误,转换到CSTRING类还错误,中断,等等等...问题一堆.

至此,各种类型元素的获取已经都拿下了.接下来研究个个元素之间的关系.现在有点感觉这些元素的关系应该也像是XML脚本一样吧.

关于这个 data="暂时没有备忘信息",也是接下来研究的内容之一.

希望对各位有所帮助
ATL发展到现在,从未提供像MFC中的CDHtmlDialog一样的HTML页面布局且方便开发者使用的窗口基类,虽然也有DHtml Control可供使用,但并不能像MFC那样通过宏映射来方便地让开发者与页面元素之间进行任意的双向交互,尤其是需要响应页面元素事件的时候,ATL/WTL爱好者必须自己编写相应的代码来完成这些工作。基于这个原因,通过理解分析MFC中CDHtmlDialog类的功能和实现行为,这里完全使用ATL一样的实现机制来模仿MFC中实现的功能编写了一个头文件,使ATL爱好者在无需MFC庞大的支持库的情形下实现跟CDHtmlDialog一样的功能,并且扩展了其能力。下载的压缩包中只有一个头文件 atldhtmldlg.h,头文件的开始部分是一段开发者使用示例的注释,以方便开发者容易地上手。这个文件提供了若干个类和模板类,开发者只需关注其中两个模板类:CDHtmlDialogImpl和CMultiPageDHtmlDialogImpl,第一个模板类实现了WEB页面布局的对话框,第二个模板类以第一个类为基础,扩展成了在一个对话框中支持多个页面。使用方式非常简单,从上述两个模板类之一继承实现一个对话框类,然后添加相应的映射宏,实现宏映射中的方法即可构造一个完美、表现能力强、控制方便的对话框窗口,例子代码像下面这样:class CMainDlg : public CDHtmlDialogImpl{ ...... // 实现页面元素事件的处理 // 请注意响应函数原型定义:HRESULT Foo(IHTMLElement*) BEGIN_DHTML_EVENT_MAP(CMainDlg) DHTML_EVENT_ONCLICK(_T("elementid1"), OnClick) DHTML_EVENT_ONMOUSEMOVE(_T("elementid2"), OnMouseMove) DHTML_EVENT_ELEMENT(DISPID_HTMLELEMENTEVENTS_ONMOUSEOVER, _T("elementid"), OnMouseOver) // id为elementid的元素事件响应 DHTML_EVENT_CLASS(DISPID_HTMLELEMENTEVENTS_ONMOUSEOVER, _T("myclass"), OnMouseOver) // class为myclass的元素事件响应 DHTML_EVENT_TAG(DISPID_HTMLELEMENTEVENTS_ONMOUSEOVER, _T("div"), OnMouseOver) // 所有DIV元素的onmouseover事件响应 DHTML_EVENT_AXCONTROL(controlMethodDISPID, _T("objectid"), OnControlMethod) // ActiveX控件事件响应 END_DHTML_EVENT_MAP() // 实现外部DISPATCH方法,能在这里添加任意的方法供页面中的脚本调用 // 调用方式如下:window.external.about(123, "abc") // 请注意响应函数的原型定义:void Foo(VARIANT*,VARIANT*,VARIANT*) // 目前仅仅定义了三个参数,一般也足够使用了。如果脚本实际调用中只提供了2个参数,则第三个指针参数是NULL。以此类推 BEGIN_EXTERNAL_METHOD_MAP(CMainDlg) EXTERNAL_METHOD(_T("about"), OnAbout) END_EXTERNAL_METHOD_MAP() void OnAbout(VARIANT* para1, VARIANT* para2, VARIANT* para3) { // your code is here. } HRESULT OnClick(IHTMLElement *pElement) { // your code is here. return S_OK; } HRESULT OnMouseMove(IHTMLElement *pElement) { // your code is here. return S_OK; } ......}除了上面的例子,还有CMultiPageDHtmlDialogImpl中的一些映射宏,以及还有一些虚函数可供重载。对话框设计好后,调用方法也很简单,例子如下: CMainDlg dlg; dlg.m_nHtmlResID = IDR_YOUR_HTML_RESOURCE_ID; // open your resource or dlg.m_szHtmlResID = _T("C:\\yourname.html"); // open your resource or dlg.m_strCurrentUrl = _T("www.microsoft.com"); // open local html file or external URL dlg.Create(NULL); // or dlg.DoModal(NULL);好了,介绍就到这里,如果有更多疑问,请下载头文件查看源代码以及注释,本次下载的文件版本是 1.02。当前版本的一个缺憾是尚未支持DDX/DDV,原因是ATL并未提供DDX机制,下个版本将完全仿照WTL的方式实现该类的DDX/DDV。另外为了通用性以及减少依赖,代码中完全未使用CString或CAtlString,主要是MFC、ATL、WTL各自提供了自己的CString实现。版权特别声明:本软件源码完全属作者James(胡柏华)自创,作者拥有修改和变更代码特性的权利,任何团体或个人均可以自由下载并免费使用。如用于商业用途,请在所属商业软件的版权声明中加注本声明。使用者使用本源码的过程中产生的任何错误,作者并无义务提供技术支持,由此导致的任何损失,作者概不负责。2007-11-7

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧