用WebBrowser空间得到IHTMLDocument借口可以完成解析,但我不希望WebBrowser渲染网页,仅仅希望解析出DOM树就可以了。
有什么接口函数可以做到?

解决方案 »

  1.   

    IHTMLDOMNode
    IHTMLDOMNode2
    IHTMLDOMAttribute
    IHTMLDOMAttribute2msdn 例子:
    IHTMLDOMNode* pElemDN;
    IDispatch* pACDisp;
    IHTMLAttributeCollection* pAttrColl;
    IDispatch* pItemDisp;
    IHTMLDOMAttribute* pItem;LONG lACLength;
    VARIANT vACIndex;
    BSTR bstrName;
    VARIANT vValue;
    VARIANT_BOOL vbSpecified;m_pElem->QueryInterface(IID_IHTMLDOMNode, (void**)&pElemDN);
    pElemDN->get_attributes(&pACDisp);
    pACDisp->QueryInterface(IID_IHTMLAttributeCollection, (void**)&pAttrColl);
    pAttrColl->get_length(&lACLength);vACIndex.vt = VT_I4;
    for (int i = 0; i < lACLength; i++)
    {
        vACIndex.lVal = i;
        pAttrColl->item(&vACIndex, &pItemDisp);
        pItemDisp->QueryInterface(IID_IHTMLDOMAttribute, (void**)&pItem);
        pItem->get_specified(&vbSpecified);
        pItem->get_nodeName(&bstrName);
        pItem->get_nodeValue(&vValue);
        pItemDisp->Release();
        pItem->Release();
    }pElemDN->Release();
    pACDisp->Release();
    pAttrColl->Release();
      

  2.   


    在只有html文件的情况下,怎样取得IHTMLDOMNode及相应的接口?
    怎样能不通过WebBrwoser控件而获得IHTMLDocument接口?
      

  3.   

    根据IE浏览器的运行方式,有多种不同的方式可以获取文档指针。  <1> 如果你在程序中使用MFC的 CHtmlView 视来浏览网页。
            取得文档的方法最简单,调用 CHtmlView::GetHtmlDocument() 函数。
      <2> 如果你的程序中使用了“Web 浏览器” 的ActiveX 控件。
            取得文档的方法也比较简单,调用 CWebBrowser2::GetDocument() 函数。
      <3> 如果你的程序是用 ATL 写的 ActiveX 控件。
            那么需要调用 IOleClientSite::GetContainer 得到 IOleContainer 接口,然后就可以通过 QueryInterface() 查询得到 IHTMLDocument2 的接口。主要代码如下: CComPtr < IOleContainer > spContainer;
    m_spClientSite->GetContainer( &spContainer );
    CComQIPtr < IHTMLDocument2 > spDoc = spContainer;
    if ( spDoc )
    {
         // 已经得到了 IHTMLDocument2 的接口指针
    }  <4> 如果你的程序是用 MFC 写的 ActiveX 控件。
            那么需要调用 COleControl::GetClientSite() 得到 IOleContainer 接口,然后的操作和<3>是一致的了。
      <5> IE 浏览器作为独立的进程正在运行。
            每个运行的浏览器(IE 和 资源浏览器)都会在 ShellWindows 中进行登记,因此我们要通过 IShellWindows 取得实例(示例程序中使用的就是这个方法)。主要代码如下:#include < atlbase.h >
    #include < mshtml.h >void FindFromShell() 
    {
    CComPtr< IShellWindows > spShellWin;
    HRESULT hr = spShellWin.CoCreateInstance( CLSID_ShellWindows );
    if ( FAILED( hr ) )    return; long nCount=0;
    spShellWin->get_Count(&nCount);   // 取得浏览器实例个数 for(long i=0; i<nCount; i++)
           {
                    CComPtr< IDispatch > spDisp;
    hr=spShellWin->Item(CComVariant( i ), &spDisp );
    if ( FAILED( hr ) )   continue; CComQIPtr< IWebBrowser2 > spBrowser = spDisp;
    if ( !spBrowser )     continue; spDisp.Release();
    hr = spBrowser->get_Document( &spDisp );
    if ( FAILED ( hr ) )  continue; CComQIPtr< IHTMLDocument2 > spDoc = spDisp;
    if ( !spDoc )         continue; // 程序运行到此,已经找到了 IHTMLDocument2 的接口指针
    }
    }  <6> IE 浏览器控件被一个进程包装在一个子窗口中。那么你首先要得到那个进程的顶层窗口句柄(使用 FindWindow() 函数,或其它任何可行的方法),然后枚举所有子窗口,通过判断窗口类名是否是“Internet Explorer_Server”,从而得到浏览器的窗口句柄,再向窗口发消息取得文档的接口指针。主要代码如下: 
    #include < atlbase.h >
    #include < mshtml.h >
    #include < oleacc.h >
    #pragma comment ( lib, "oleacc" )BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
    {
    TCHAR szClassName[100]; ::GetClassName( hwnd,  &szClassName,  sizeof(szClassName) );
    if ( _tcscmp( szClassName,  _T("Internet Explorer_Server") ) == 0 )
    {
    *(HWND*)lParam = hwnd;
    return FALSE; // 找到第一个 IE 控件的子窗口就停止
    }
    else return TRUE; // 继续枚举子窗口
    };void FindFromHwnd(HWND hWnd) 
    {
    HWND hWndChild=NULL;
    ::EnumChildWindows( hWnd, EnumChildProc, (LPARAM)&hWndChild );
    if(NULL == hWndChild) return; UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
    LRESULT lRes;
    ::SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*) &lRes ); CComPtr < IHTMLDocument2 > spDoc;
    HRESULT hr = ::ObjectFromLresult ( lRes, IID_IHTMLDocument2, 0 , (LPVOID *) &spDoc );
    if ( FAILED ( hr ) ) return; // 程序运行到此,已经找到了 IHTMLDocument2 的接口指针
    }
      

  4.   


    我啥都没有,只有一个xxx.htm文件,怎样得到此HTML文件的IHTMLDocument接口?不通过WebBrowser等其它控件,直接得到IHTMLDocument接口,而无须渲染页面(节省不必要的开支)。
    其实就是想通过IHTMLDocument接口操作页面执行一些动作。
      

  5.   

    用tinyXml类来解析, 超轻量级超好用, 免费。
      

  6.   

    那就用XML操作类实现吧MSXML.DLL所包括的主要COM接口有:
    1. IXMLDOMDocument(Document接口)
    DOMDocument 对象是XML DOM的基础,你可以利用它所暴露的属性和方法来浏览、查询和修改XML文档的内容和结构。DOMDocument表示了树的顶层节点,它 实现了DOM文档的所有的基本方法,并且提供了额外的成员函数来支持XSL和XSLT。它创建了一个文档对象,所有其他的对象都可以从这个文档对象中得到 和创建。
    2. IXMLDOMNode(Node接口)
    IXMLDOMNode是文档对象模型(DOM)中的基本对象,元素、属性、注释、过程指令和其他的文档组件都可以认为是IXMLDOMNode。事实上,DOMDocument对象本身也是一个IXMLDOMNode对象。
    3. IXMLDOMNodeList
    IXMLDOMNodeList实际上是一个节点(Node)对象的集合,节点的增加、删除和变化都可以在集合中立刻反映出来,可以通过"for.循环 "结构来遍历所有的节点。
      

  7.   


    我想通过IHTMLDocument接口执行一些动作,比如通过IHTMLFormElement接口执行submit动作,就可以自动发痛表单了,这样的目的XML操作类能做到吗?不是为了读取和编辑HTML文件。