C++版本:

I have a lot of experience in programming low-level MSHTML and I always see questions on how one can use MSHTML to parse HTML and then access elements via the DOM.

Well, here it is. I use IMarkupServices provided by MSHTML. There is no need for an IOleClientSite or any sort of embedding. I think is is just about as light as anyone can get.

In future articles, I will be concentrating on the reuse of MSHTML in other aspects of programming. Such as using MSHTML as an editor, for example.

This code makes use of simple COM calls and nothing more. It can be easily adapted for ATL, MFC and VB, among other languages. Please don't ask me to provide samples in other languages. In order to build this you need the IE SDK

/******************************************************************

* ParseHTML.cpp

*

* ParseHTML: Lightweight UI-less HTML parser using MSHTML

*

* Note: This is for accessing the DOM only. No image download,

* script execution, etc...

*

* 8 June 2001 - Asher Kobin (asherk@pobox.com)

*

* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY

* OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT

* LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR

* FITNESS FOR A PARTICULAR PURPOSE.

*

*******************************************************************/

#include

#include

OLECHAR szHTML[] = OLESTR("

Hello World!");

int __stdcall WinMain(HINSTANCE hInst,

HINSTANCE hPrev,

LPSTR lpCmdLine,

int nShowCmd)

{

IHTMLDocument2 *pDoc = NULL;

CoInitialize(NULL);

CoCreateInstance(CLSID_HTMLDocument,

NULL,

CLSCTX_INPROC_SERVER,

IID_IHTMLDocument2,

(LPVOID *) &pDoc);

if (pDoc)

{

IPersistStreamInit *pPersist = NULL;

pDoc->QueryInterface(IID_IPersistStreamInit,

(LPVOID *) &pPersist);

if (pPersist)

{

IMarkupServices *pMS = NULL;

pPersist->InitNew();

pPersist->Release();

pDoc->QueryInterface(IID_IMarkupServices,

(LPVOID *) &pMS);

if (pMS)

{

IMarkupContainer *pMC = NULL;

IMarkupPointer *pMkStart = NULL;

IMarkupPointer *pMkFinish = NULL;

pMS->CreateMarkupPointer(&pMkStart);

pMS->CreateMarkupPointer(&pMkFinish);

pMS->ParseString(szHTML,

0,

&pMC,

pMkStart,

pMkFinish);

if (pMC)

{

IHTMLDocument2 *pNewDoc = NULL;

pMC->QueryInterface(IID_IHTMLDocument,

(LPVOID *) &pNewDoc);

if (pNewDoc)

{

// do anything with pNewDoc, in this case

// get the body innerText.

IHTMLElement *pBody;

pNewDoc-gt;get_body(&pBody);

if (pBody)

{

BSTR strText;

pBody->get_innerText(&strText);

pBody->Release();

SysFreeString(strText);

}

pNewDoc->Release();

}

pMC->Release();

}

if (pMkStart)

pMkStart->Release();

if (pMkFinish)

pMkFinish->Release();

pMS->Release();

}

}

pDoc->Release();

}

CoUninitialize();

return TRUE;

}

Delphi版本1:

( add to uses clause, MSHTML, ActiveX, ComObj )

const

IID_IPersistStreamInit : TGUID = '{7FD52380-4E07-101B-AE2D-08002B2EC713}';

procedure TFormMain.FormCreate(Sender: TObject);

var

pDoc : IHTMLDocument2;

pNewDoc : IHTMLDocument2;

pPersist : IPersistStreamInit;

pMS : IMarkupServices;

pMC : IMarkupContainer;

pMkStart : IMarkupPointer;

pMkFinish : IMarkupPointer;

pBody : IHTMLElement;

strText : string;

szHTML : widestring;

didInit : boolean;

begin

didInit :=Succeeded(CoInitialize(nil));

szHTML :='

Hello World!';

CoCreateInstance(CLASS_HTMLDocument, nil, CLSCTX_INPROC_SERVER, IID_IHTMLDocument2, pDoc);

if pDoc <> nil then

begin

pDoc.QueryInterface(IID_IPersistStreamInit, pPersist);

if (pPersist <> nil) then

begin

pPersist.InitNew;

pPersist._Release;

pDoc.QueryInterface(IID_IMarkupServices, pMS);

if (pMS <> nil) then

begin

pMS.CreateMarkupPointer(pMkStart);

pMS.CreateMarkupPointer(pMkFinish);

pMS.ParseString(word(szHTML[1]), 0, pMC, pMkStart, pMkFinish);

if (pMC <> nil) then

begin

pMC.QueryInterface(IID_IHTMLDocument, pNewDoc);

if (pNewDoc <> nil) then

begin

// do anything with pNewDoc, in this case

// get the body innerText.

pBody :=pNewDoc.Get_body;

if (pBody <> nil) then

begin

strText :=pBody.Get_innerText;

m.Text :=strText;

pBody._Release;

end;

pNewDoc._Release;

end;

pMC._Release;

end;

if (pMkStart <> nil) then pMkStart._Release;

if (pMkFinish <> nil) then pMkFinish._Release;

pMS._Release;

end;

pPersist._Release;

end;

pDoc._Release;

end;

if didInit then CoUninitialize();

end;

Delphi版本2:

( add to uses clause, MSHTML, ActiveX, ComObj )

const

IID_IPersistStreamInit : TGUID = '{7FD52380-4E07-101B-AE2D-08002B2EC713}';

procedure TFormMain.FormCreate(Sender: TObject);

var

pDoc : IHTMLDocument2;

pBody : IHTMLElement;

strText : string;

szHTML : widestring;

didInit : boolean;

begin

didInit :=Succeeded(CoInitialize(nil));

szHTML :='

Hello World!';

CoCreateInstance(CLASS_HTMLDocument, nil, CLSCTX_INPROC_SERVER, IID_IHTMLDocument2, pDoc);

if pDoc <> nil then

begin

pDoc.Set_designMode('On'); //no script execution

while not (pDoc.readyState = 'complete') do Application.ProcessMessages;

pDoc.body.innerHTML :=szHTML;

pBody :=pDoc.Get_body;

if pBody <> nil then

strText :=pBody.Get_innerText else strText :='';

m.Text :=strText;

pDoc._Release;

end;

if didInit then CoUninitialize();

end;

============== Other Useful Routines ===============

============== Other Useful Routines ===============

============== Other Useful Routines ===============

function GetHTMLSource(Document: IDispatch) : string;

var

pStream : IStream;

pPersist : IPersistStreamInit;

li,lo : int64;

stat : STATSTG;

str : string;

BytesRead : longint;

begin

result :='';

if SUCCEEDED(CreateStreamOnHGlobal(0, TRUE, pStream)) then

begin

if (SUCCEEDED(Document.QueryInterface(IID_IPersistStreamInit, pPersist))) then

begin

pPersist.Save(pStream, FALSE);

li :=0;

pStream.Seek(li, STREAM_SEEK_SET, lo);

pStream.Stat(stat, 0);

SetLength(str,stat.cbSize + 1);

pStream.Read(@str[1], stat.cbSize, @BytesRead);

result :=str;

end;

end;

end;

procedure SetHTMLSource(Document: IDispatch; value: string);

var

stm : TMemoryStream;

psi : IPersistStreamInit;

sa : TStreamAdapter;

begin

stm :=TMemoryStream.Create;

stm.SetSize(Length(value));

stm.Seek(0,0);

stm.Write(value[1],Length(value));

stm.Seek(0,0);

sa :=TStreamAdapter.Create(stm, soReference); //if you pass soOwned instead, the stream will be freed for you

if (SUCCEEDED(Document.QueryInterface(IID_IPersistStreamInit,psi))) then

psi.Load(sa);

end;

mshtml 解析html c,使用MSHTML解析HTML代码相关推荐

  1. 【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )

    文章目录 安卓直播推流专栏博客总结 一. AAC 音频格式解析 二. FLV 音频数据标签解析 1. 分析 FLV 格式中的 AAC 音频格式数据 2. AAC 音频特殊配置 3. AAC 音频数据标 ...

  2. Python命令行解析:IDE内点击Run运行代码直接得出结果、基于TF flags(或argparse、sys.argv)在Dos内命令行(一条命令)调用代码文件得出结果

    Python命令行解析:IDE内点击Run运行代码直接得出结果.基于TF flags(或argparse.sys.argv)在Dos内命令行(一条命令)调用代码文件得出结果 目录 命令行解析 T1.采 ...

  3. jsp无法解析java方法_Spring无法解析JSP视图

    我有一个Tomcat部署,其中一个webapp生活在 web/WEB-INF 中 . 这是我实例化 spring 容器的方式: report org.springframework.web.servl ...

  4. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  5. android 数组指针异常,Android JSON解析Json数组是[]在解析时抛出空指针异常,如何以正确的方式写入?...

    我有复杂的API,我解析并显示在列表视图中,我将努力解析JSONArray.Here我将在斗争之后Json数组这是在帖子json对象"tags_name":["Activ ...

  6. dubbo源码深度解析_Spring源码深度解析:手把手教你搭建Spring开发环境

    Spring环境搭建流程,如果是第一次接触spring源码的环境搭建,确实还是比较麻烦的. 作者使用的编译器为目前流行的lntelliJ IDEA,版本为2018旗舰版.Eclipse用户还需要自己揣 ...

  7. mysql ddl 语法解析工具_sharding-sphere之语法解析器

    语法解析器,根据不同类型的语句有不同的语法解析器去解析成成SQLStatement,SQL解析器的类图我用脑图画出来如下: SQLParser.png 可以看到,不同的sql有不同的处理解析器去解析, ...

  8. Spring源码解析:自定义标签的解析过程

    2019独角兽企业重金招聘Python工程师标准>>> spring version : 4.3.x Spring 中的标签分为默认标签和自定义标签两类,上一篇我们探究了默认标签的解 ...

  9. 找到你的位置(JS在页面中的位置)最常用的方式是在页面中head部分放置script元素,浏览器解析head部分就会执行这个代码,然后才解析页面的其余部分...

    找到你的位置(JS在页面中的位置) 我们可以将JavaScript代码放在html文件中任何位置,但是我们一般放在网页的head或者body部分. 放在<head>部分 最常用的方式是在页 ...

  10. python的网页解析器_python 之网页解析器

    一.什么是网页解析器 1.网页解析器名词解释 首先让我们来了解下,什么是网页解析器,简单的说就是用来解析html网页的工具,准确的说:它是一个HTML网页信息提取工具,就是从html网页中解析提取出& ...

最新文章

  1. Android Studio开发RecyclerView遇到的各种问题以及解决(一)
  2. xmind思维导图之如何进行深度工作
  3. 好端端的程序员,咋就成了新生代农民工!
  4. 布隆过滤器速度_详解布隆过滤器的原理、使用场景和注意事项
  5. 识别波峰波谷算法_马丁普林格:波峰-波谷演进法
  6. N - Dragon Balls(并查集+深度的意义
  7. TensorFlow 深入MNIST
  8. 【干货】2020顶级数据团队建设全景报告-清华大学.pdf(附下载链接)
  9. 徘徊于斗牛之间 —— 星象、星宿与星座(风水)
  10. Google开源的操作系统Fuchsia,专为大内存硬件设计
  11. 媒体查询(黑马笔记)-移动端布局rem
  12. 小金鱼呀 python-django-初识Form组件(Form类)
  13. node2vec python_图上的机器学习系列-聊聊Node2vec
  14. android能播放4k视频格式,四平台六款手机4K视频播放实测
  15. 模板引擎template.js
  16. 计算机病毒防治教案,计算机病毒与防治教案
  17. last_load_time和last_active_time的选择
  18. SharePoint 内容编辑器部件介绍
  19. Unity C# 腾讯云【短信服务】验证码功能
  20. Gif动态图片怎么做?教你简单的gif合成小窍门

热门文章

  1. POI jar包下载
  2. Python科学计算初探——余弦相似度
  3. 学弟学妹看我文章顺利毕业,基于HTML+Javascript五子棋人机博弈系统设计与实现《记得收藏》
  4. mysql使用sql脚本建立数据库
  5. 应用系统适配迁移方案
  6. NTKO Weboffice打开文档格式错误的解决方案
  7. 微信小程序图片全屏显示
  8. 二级c语言试卷合集pdf,全国计算机二级C语言历年真题完整版.pdf
  9. E-prime 行为实验设计
  10. github入门教程最全中文版(官方)