Delphi 通过MSHTML实现一个HTML解析类
delphi中Webbrowser的使用技巧

WebBrowser组件和MSHTML 在Delphi 中的使用由于项目需要,近来研究了一下WebBrowser组件和MSHTML 在Delphi中的使用,整理了一下这段时间研究的结果,写下来一是方便大家查阅,二也可以加深我自己的记忆.希望能对大家有所帮助… …,同时,如果有更好的处理方式或者我没有提到的问题,请大家也告诉我哦, 咱们一块进步… ...,其中一部分是我从网络中搜集的资料,谢谢那些兄弟们… … MSHTML把HTML页面中的元素封装成了IHTMLInputElement、 IHTMLInputButtonElement、IHTMLInputTextElement、IHTMLTextAreaElement、IHTMLTitleElement、IHTMLFormElement 等等组件接口。
在程序中可以通过MSHTML提供的IHTMLDocument2接口得到整个Document对象,IHTMLElementCollection接口得到所有页面元素的集合,通过该接口的Item方法可以得到具体的某个组件,然后设置和读取该组件的属性值。
下面是一些常用功能的事例代码.1.打开某个页面:web.Navigate(ExtractFilePath(Application.ExeName) + 'Template/login.html'); 2.取出页面中某个HtmlElement的Value属性值:function GetValueByElementName(web: TWebBrowser; elementName: string; index: integer): string;beginresult := (((web.Document as IHTMLDocument2).body.all as IHTMLElementCollection).item(elementName, index) as IHTMLInputElement).valueend;3.给HtmlElement设置Value属性procedure SetValueTextAreaName(web: TWebBrowser; elementName, value: string;index: integer);begin(((web.Document as IHTMLDocument2).body.all asIHTMLElementCollection).item(elementName, index) as IHTMLTextAreaElement).value := value;end;4.判断页面执行结果是否成功因为Web应用中如果出错的一般是采用错误页面的方式呈现给最终用户,所以我们也无法抓到Http错误,只能通过在webBeforeNavigate2事件中将URL参数记录到全局变量中, 然后在webDocumentComplete事件中根据URL参数和全局变量中的URL参数来判断执行结果是否正确.当然,这样需要将页面地址编码到代码中,降低了灵活性,但是这也是我能想到的唯一的方法,如果大家有什么好的方法,请告诉我哦.5.屏蔽鼠标右键和某些快捷键本功能需要在webBrowser的窗口中加入ApplicationEvents组件,设置它的OnMessage事件代码如下即可.procedure TwebAdapterForm.ApplicationEvents1Message(var Msg: tagMSG;var Handled: Boolean);const_KeyPressMask = $80000000;begin//禁用右键with Msg dobeginif not IsChild(web.Handle, hWnd) then Exit;Handled := (message = WM_RBUTTONDOWN) or (message = WM_RBUTTONUP) or (message = WM_CONTEXTMENU);end;//禁止Ctrl + N//禁止Ctrl + F//禁止Ctrl + Aif Msg.message = WM_KEYDOWN thenbeginif ((Msg.lParam and _KeyPressMask) = 0) and(GetKeyState(VK_Control) <0) and ((Msg.wParam = Ord('N'))or (Msg.wParam = Ord('F')) or (Msg.wParam = Ord('A'))) thenbeginHandled := True;end;end;end;6.在页面关闭的时候,同时关掉包含页面的VCL Form.(仅限 InternetExplorer 6.0)本功能需要卸载掉Delphi自带的 WebBrowser组件,安装ActionX组件(Microsoft Internet Controls V1.1),而且以后的程序只能运行在安装有Internet Explorer 6.0 的环境下.具体方法如下:在WebBrowser组件的OnWindowClosing事件中,输入self.close; 代码即可.如果需要阻止窗口的关闭, 设置CanClose参数的值为Flase.7.如何将页面中超链接新开的页面窗口包到指定的VCL窗口中.procedure TForm1.webNewWindow2(Sender: TObject; var ppDisp: IDispatch;var Cancel: WordBool);varform : TForm1;beginform := TForm1.Create(nil);ppDisp := form.web.DefaultDispatch;form.Show;end;8.在WebBrowser加载html页面完成后,在页面顶端插入HTML代码, 下面两种方式斗可以.{1. ----------------------------------------------------------------} procedure TForm1.Button1Click(Sender: TObject);varRange: IHTMLTxtRange;beginRange := ((WebBrowser1.Document as IHTMLDocument2).body as IHTMLBodyElement).createTextRange;Range.collapse(False);Range.pasteHTML('<br/><b>Hello!</b>');end;{2. ----------------------------------------------------------------} procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;const pDisp: IDispatch; var URL: OleVariant);varWebDoc: HTMLDocument;WebBody: HTMLBody;beginWebDoc := WebBrowser1.Document as HTMLDocument;WebBody := WebDoc.body as HTMLBody;WebBody.insertAdjacentHTML('BeforeEnd', '<h1>Hello World!</h1>');end;9.将页面中显示的内容全部选中,然后粘贴到Word文档中.WebBrowser1.ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT);//全选网页WebBrowser1.ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT); //复制网页WordDocu.Range.Paste; //word文档粘贴WebBrowser1.ExecWB(OLECMDID_UNDO, OLECMDEXECOPT_DODEFAULT); //取消全选注:WebBrowser的Document属性值和WordDocument的Document属性值必须都不为nil. 10.如何解决网页不响应回车事件public{ Public declarations }procedure MsgHandle(var Msg :TMsg; var Handled :Boolean);end;varForm1: TForm1;FOleInPlaceActiveObject :IOleInPlaceActiveObject;implementation{$R *.DFM}procedure TForm1.MsgHandle(var Msg :TMsg; var Handled :Boolean);variOIPAO :IOleInPlaceActiveObject;Dispatch :IDispatch;beginif WebBrowser1 =nil thenbeginHandled :=False;Exit;end;Handled :=(IsDialogMessage(WebBrowser1.Handle, Msg) =True);if (Handled) and (not WebBrowser1.Busy) thenbeginif FOleInPlaceActiveObject =nil thenbeginDispatch :=WebBrowser1.Application;if Dispatch <>nil thenbeginDispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);if iOIPAO <>nil thenFOleInPlaceActiveObject :=iOIPAO;end;end;end;if FOleInPlaceActiveObject <>nil thenif ((Msg.message =WM_KEYDOWN) or (Msg.Message =WM_KEYUP)) and ((Msg.wParam =VK_BACK) or (Msg.wParam =VK_LEFT) or (Msg.wParam =VK_RIGHT)) thenelseFOleInPlaceActiveObject.TranslateAccelerator(Msg);end;procedure TForm1.FormCreate(Sender: TObject);beginApplication.OnMessage :=MsgHandle;end;procedure TForm1.FormDestroy(Sender: TObject);beginFOleInPlaceActiveObject :=nil;end;11.如何在WebBrowser中调用当前页面中的javascript函数SayHello()WebBrowser1.OleObject.Document.parentWindow.execScript('SayHello()', 'javascript');//or(WebBrowser1.Document as IHTMLDocument2).parentWindow.execScript('SayHello()', 'javascript')//orwebrowser1.document.script.SayHello();delphi中Webbrowser的使用技巧1.获取网页中变量的值例如:htm中<script> var currIDS=123</script>程序中可以这样调用 id :=Form1.WebBrowser1.OleObject.Document.script.currIDS备注:变量可以是javascript定义的,也可以是vbscript定义的,如果Webbrowser1中找不到该变量,调用会触发一个异常事件,即变量currIDS不存在。
Delphi程序与Html界面的交互方法

Delphi程序与Html界面的交互方法Delphi程序与Html界面的交互方法在用Delphi、Visual Basic等可视化快速开发工具编写Windows 应用程序时,常会遇到这样几个问题:1) 希望程序界面美观。
在Delphi中,开发人员通常使用各种控件来实现界面的风格化,但缺点是造成应用程序体积较大,且在升级时常会被控件版本与Delphi版本不兼容带来的问题所困扰。
2) 希望应用程序在功能不变的情况下具有不同的界面风格。
这常常通过换“皮肤“的技术来实现,但一般实现“换肤“功能的控件体积都较大,且界面反应速度比较慢,而且“皮肤“的制作比较麻烦。
3) 程序界面的维护困难。
为了使界面与代码实现相分离而获得“换肤“等灵活性,通常要用到一些设计模式的技术,这对于不熟悉设计模式的开发人员来说比较困难。
微软在 Windows xp 之后的产品,包括 Vista, Windows 7 的应用程序的结构及部署将有重大变革,其中一项就是应用程序的界面完全以XML的一个扩展集XAML语言来描述,以便达到界面的高度可定制性。
其中Silverlight 就是一个典型的应用。
从中或许我们可以得到一些启示。
在Delphi 中类似的解决方案就是使用浏览器控件加载HTML 页面。
微软的网页浏览器 Internet Explorer 的核心被设计为可以嵌入到应用程序中重用的ActiveX组件,它有极强的可编程能力和与容器交互的能力,使得开发人员能够快速地开发出功能强劲的应用程序。
我们平常运行的 iexplorer.exe 其实只是一个外壳程序,真正的浏览网页、记录历史等工作是由嵌入其窗口的封装在shdocvw.dll 中的WebBrowser Control 来完成的。
Shdocvw.dll 的功能则是调用 mshtml.dll 来解析网页,以及在它的窗口中嵌入其它活动文档组件(如Microsoft Office、Adobe Acrobat 等应用程序的文档都可以嵌入到浏览器窗口中查看)。
delphi htmlparser 实例

在Delphi中,可以使用开源的第三方库如"Tidy"或"Html-Tidy"来解析HTML。
这些库提供了对HTML文档进行解析、清理和转换的功能。
1.首先,你需要下载并安装Tidy库。
可以从官方网站上下载源代码或预编译
的二进制文件。
2.在Delphi中,使用以下代码示例来加载HTML文档并使用Tidy进行解析:
在上述代码中,你需要将Your HTML content here替换为你实际的HTML内容。
还可以根据需要设置其他Tidy选项,例如清理和修复HTML、显示警告信息等。
解析后的文档存储在Doc变量中,你可以根据需要进行进一步的处理。
请注意,这只是一个简单的示例,实际应用中可能需要更多的代码来处理异常情况、处理解析结果等。
此外,你还需要确保在Delphi项目中引入了Tidy库的正确路径和库文件。
Python之Html解析方法

Python之Html解析⽅法⼀、强⼤的BeautifulSoup:BeautifulSoup是⼀个可以从html或xml⽂件中提取数据的Python库。
它能够通过你喜欢的转换器实现惯⽤的⽂档导航、查找、修改⽂档的⽅式。
在Python开发中,主要⽤的是BeautifulSoup的查找提取功能,修改功能很少使⽤1、安装BeautifulSouppip3 install beautifulsoup42、安装第三⽅html解析器lxmlpip3 install lxml3、安装纯Python实现的html5lib解析器pip3 install html5lib⼆、BeautifulSoup的使⽤:1、导⼊bs4库from bs4 import BeautifulSoup #导⼊bs4库2、创建包含html代码的字符串html_str = """<html><head><title>The Dormouse's story</title></head><body><p class="title"><b>The Dormouse's stopy</b></p><p class="story">Once upon a time there were three little sisters;and their names where<a href="/elsie" class="sister" id="link1"><!--Elsie--></a>"""3、创建BeautifulSoup对象(1)直接通过字符串⽅式创建soup = BeautifulSoup(html_str,'lxml') #html.parser是解析器,也可是lxmlprint(soup.prettify()) ------>输出soup对象的内容(2)通过已有的⽂件来创建soup = BeautifulSoup(open('/home/index.html'),features='html.parser')#html.parser是解析器,也可是lxml4、BeautifulSoup对象的种类:BeautifulSoup将复杂HTML⽂档转换成⼀个复杂的树形结构,每个节点都是Python对象(1)BeautifulSoup:表⽰的是⼀个⽂档的全部内容。
delphi,几个实用的HTML解析函数

delphi,几个实用的HTML解析函数原文地址:delphi,几个实用的HTML解析函数作者:德尔斐-清风1)HTML 标签值攫取函数,任意标签哦,纯字符串分析,可以配合IDHTTP编程uses StrUtils;function ExtractHtmlTagValues(const HtmlText: string; TagName, AttribName: string; var Values: TStringList): integer;function FindFirstCharAfterSpace(const Line: string; StartPos: integer): Integer;var i: integer;beginResult := -1;for i := StartPos to Length(Line) dobeginif (Line[i] <> ' ') thenbeginResult := i;exit;end;end;end;function FindFirstSpaceAfterChars(const Line: string;StartPos: integer): Integer;beginResult := PosEx(' ', Line, StartPos);end;function FindFirstSpaceBeforeChars(const Line: string; StartPos: integer): Integer;var i: integer;beginResult := 1;for i := StartPos downto 1 dobeginif (Line[i] = ' ') thenbeginResult := i;exit;end;end;end;var InnerTag: string;LastPos, LastInnerPos: Integer;SPos, LPos, RPos: Integer;AttribValue: string;ClosingChar: char;TempAttribName: string;beginResult := 0;LastPos := 1;while (true) dobegin// find outer tags '<' & '>'LPos := PosEx('<', HtmlText, LastPos);if (LPos <= 0) then break;RPos := PosEx('>', HtmlText, LPos+1);if (RPos <= 0) thenLastPos := LPos + 1elseLastPos := RPos + 1;// get inner tagInnerTag := Copy(HtmlText, LPos+1, RPos-LPos-1);InnerTag := Trim(InnerTag); // remove spacesif (Length(InnerTag) < Length(TagName)) then continue;// check tag nameif (SameText(Copy(InnerTag, 1, Length(TagName)), TagName)) thenbegin// found tagAttribValue := '';LastInnerPos := Length(TagName)+1;while (LastInnerPos < Length(InnerTag)) dobegin// find first '=' after LastInnerPosRPos := PosEx('=', InnerTag, LastInnerPos);if (RPos <= 0) then break;// this way you can check for multiple attrib names and not a specific attribSPos := FindFirstSpaceBeforeChars(InnerTag, RPos);TempAttribName := Trim(Copy(InnerTag, SPos, RPos-SPos));if (true) thenbegin// found correct tagLPos := FindFirstCharAfterSpace(InnerTag, RPos+1);if (LPos <= 0) thenbeginLastInnerPos := RPos + 1;continue;end;LPos := FindFirstCharAfterSpace(InnerTag, LPos); // get to first char after '='if (LPos <= 0) then continue;if ((InnerTag[LPos] <> '"') and (InnerT ag[LPos] <> '''')) then begin// AttribValue is not between '"' or ''' so get itRPos := FindFirstSpaceAfterChars(InnerTag, LPos+1);if (RPos <= 0) thenAttribValue := Copy(InnerTag, LPos, Length(InnerTag)-LPos+1)elseAttribValue := Copy(InnerTag, LPos, RPos-LPos+1);endelsebegin// get url between '"' or '''ClosingChar := InnerTag[LPos];RPos := PosEx(ClosingChar, InnerTag, LPos+1);if (RPos <= 0) thenAttribValue := Copy(InnerTag, LPos+1, Length(InnerTag)-LPos-1)elseAttribValue := Copy(InnerTag, LPos+1, RPos-LPos-1)end;if (SameText(TempAttribName, AttribName)) and (AttribValue <> '') thenbeginValues.Add(AttribValue);inc(Result);end;end;if (RPos <= 0) thenLastInnerPos := Length(InnerTag)elseLastInnerPos := RPos+1;end;end;end;end;用法示例:取得页面中所有链接varLinks : TStringList;LinkFound,i : Integer;beginLinks := TStringList.Create;LinkFound := ExtractHtmlTagValues(HtmlText,'A','HREF',Links);for i:=0 to LinkFound-1 dobegin//Add your own codes hereend;Links.Free;end;2)表单元素值攫取函数,可以从HTML文本中按照给定的Input 名称解析出其Valuefunction GetValByName(S, Sub: string) : string;varEleS,EleE,iPos: Integer;ELeStr,ValSt: String;St,Ct : Integer;function FindEleRange(str: string ; front : boolean; posi : integer): Integer;vari: integer;beginif Front thenbeginfor i:=posi-1 downto 1 doif Str[i]='<' thenbeginResult := i;break;end;end else beginfor i := posi+1 to length(Str) doif Str[i]='>' thenbeginResult := i;break;end;end;end;function FindEnd (str : string; posi : integer) : Integer;vari: integer;beginfor i:=posi to length(str) dobeginif (str[i] ='"') or (str[i] ='''') or (str[i] =' ') thenbeginresult := i-1;break;end;end;end;beginiPos := Pos('name="'+lowercase(Sub)+'"',lowercase(S));if iPos = 0 then iPos := Pos('name='+lowercase(Sub),lowercase(S));if iPos = 0 then iPos := Pos('name='''+lowercase(Sub)+'''',lowercase(S));if iPos = 0 then exit;EleS := FindEleRange(S,TRUE,iPos);EleE := FindEleRange(S,FALSE,iPos);EleStr := Copy(S,EleS,EleE-EleS+1);ValSt := 'value="';iPos := Pos(ValSt,EleStr);if iPos = 0 thenbeginValSt := 'value=''';iPos := Pos(ValSt,EleStr);end;if iPos = 0 thenbeginValSt := 'value=';iPos := Pos(ValSt,EleStr);end;St := iPos+length(ValSt);Ct := FindEnd(EleStr,St)-St+1;Result := Copy(EleStr,St,Ct);end;用法示例:取得页面中名为 Submit 的表单项的值varInputValue : String;beginInputValue := GetValByName(HtmlText,'Submit'); end;3)取某两个字符串中间的字符function getStrFromHtml(var Source: String; SbStr, bStr, eStr: String): String;varI: Integer;sbPos, bPos, ePos: Integer;S: String;beginS := Source;Result := '' ;if SBStr <> '' thenBeginsbPos := Pos(UpperCase(SbStr), UpperCase(S));if sbPos > 0 thenDelete(S, 1, sbPos - 1 + length(sbStr))ElseExit;End;bPos := Pos(UpperCase(bStr), UpperCase(S));if bPos > 0 thenDelete(S, 1, bPos - 1 + length(bStr))ElseExit;ePos := pos(UpperCase(eStr), UpperCase(S));if ePos > 0 thenDelete(S, ePos, length(S));Result := S;end;用法实例:FUserID := getStrFromHtml(reqStr, 'id="userID"', 'value="', '"');。
两个分析HTML网页的方法(delphi编程)

两个分析HTML网页的方法(delphi编程)两个分析HTML网页的方法(delphi编程)2009-01-20 16:16:36| 分类: Delphi专区 |举报 |字号订阅有人想把Web Page拉下来并抽取其中的内容。
这其实是搜索引擎的一项最最基本的工作:下载,抽取,再下载。
我早年做过一个Search Engine项目,不过代码都已经不见了。
这次有人又问到我这个事情,我给攒了两个方法。
方法A,在一个WinForm里面用一个隐藏的Browser控件下载Web Page,并用IHTMLDocument来分析内容。
这个方法比较简单,但如果对于大量文件的分析速度很慢。
这个方法中用到的主要代码如下:private void button1_Click(object sender, System.EventArgs e) {object url="";object nothing=null;this.axWebBrowser1.Navigate2(ref url,ref nothing,ref nothing,ref nothing,ref nothing);this.axWebBrowser1.DownloadComplete+=newSystem.EventHandler(this.button2_Click);}private void button2_Click(object sender, System.EventArgs e) {this.textBox1.Text="";mshtml.IHTMLDocument2doc=(mshtml.IHTMLDocument2)this.axWebBrowser1.Document;mshtml.IHTMLElementCollection all=doc.all;System.Collections.IEnumeratorenumerator=all.GetEnumerator();while(enumerator.MoveNext() && enumerator.Current!=null){mshtml.IHTMLElementelement=(mshtml.IHTMLElement)(enumerator.Current);if(this.checkBox1.Checked==true){this.textBox1.Text+="\r\n\r\n"+element.innerHTML;}else{this.textBox1.Text+="\r\n\r\n"+element.outerHTML;}}}方法B,用.WebClient下载Web Page存到本地文件或者String中用正则表达式来分析。
使用Python解析HTML网页

使用Python解析HTML网页
使用Python解析HTML网页是指用Python这门编程语言来解析HTML文档,也就是网页的源代码,以便取得其中的有用信息。
Python解析HTML网页主要分两种:一种是采用正则表达式(regular expressions),另外一种是使用Python标准库里的HTMLParser模块。
采用正则表达式的方法,有较大的灵活性和实时性,只要能用正则表达式表达,都可以快速有效地把网页的信息抓取出来,但是假如表达式写得比较乱,就会影响它的稳定性,因此,一般不会采用这种方式来解析复杂的HTML。
而使用HTMLParser模块则可以实现更为复杂和稳定的解析,它对解析的网页有一定的假设,如果这些假设不能得到满足,HTMLParser模块将可能出错。
但它有一定的清晰度,可以区分开各个模块,因此更适合处理复杂的HTML文档。
HTMLParser在Python的标准库中有提供,可以直接使用,整个模型内部实际上是实现了一个状态机,一行一行地解析HTML文档,然后由用户自定义处理各个标签,最终达到取得想要信息的目的。
总之,Python解析HTML网页是一门十分有用的技术,它可以帮助我们快速、准确地提取我们需要的信息。
如果想要实现功能更加复杂的网页解析,那么可以使用python的
BeautifulSoup第三方库,它可以更加方便地对HTML文档进行解析。
delphi网页控制

查看文章[学习]用MSHTML控制网页中所有元素(delphi代码)2008-04-15 17:11用VS2005中的WebBrowser来控制网页中的元素,虽然VS2005封装了很多不错的功能,但用起来总觉得有所欠缺。
比如我想如得到框架页内网页的源码,找来的去,就是找不到合适的方法。
MSHTML是微软公司的一个COM组件,该组件封装了HTML语言中的所有元素及其属性,通过其提供的标准接口,可以访问指定网页的所有元素.MSHTML 对象模型是由一些对象和集合组成的.处于根部的是HTML,描述了打开页面的1个窗口,包括一系列集合和对象。
如Frames集合,History,Location,Navigator,Document,Vi—sum,Event对象等.其中描述呈现在客户窗口实际网页的是Document对象。
由一系列的属性、方法、对象和集合组成.其中All集合中包含网页中所有标记(Tag)元素,其主要的方法和属性有:(1)Length(长度):即标记出现的个数,可以把标记的集合理解为从0开始的一维数组,其次序按照标记在网页位置排列;(2)Tags(标记):用于过滤出给定标记的集合,如Doc.Al1.Tags(P)得到所有分段标记P;(3)Item(项目):用于选择集合中的某1个元素,如object.item(0)得到集合的第1个元素,而object.item(i)得到第i+1个元素.此外,IHTMLElement也是个常用的集合对象,代表网页中指定标记的集合,通过这个集合对象,可以得到网页上特定标记的内容.IHTMLElement有4个主要属性:(1)InnerText:开始标记和结束标记之间的文本;(2)InnerHTML:开始标记和结束标记之间的文本和HTML;(3)OuterText:对象的文本;(4)OuterHTML:对象的文本和HTML.自动提交当提交数据按钮没有NAME属性时,采用如下方法:Delphi 网页内容查询控制(idHttpControl,idAntiFreezeControl,TProgressBar)Delphi 2010-06-28 14:39:13 阅读61 评论0 字号:大中小订阅直接采用Delphi自带Control控件INDY组件为例.新建个工程,放上个TIdHTTPControl控件,个TIdAntiFreezeControl控件,个TProgressBar用于显示下载进度.最后放上个TButton用于开始执行我们命令.代码如下:procedure TForm1.Button1Click(Sender: TObject);//点击按钮时候开始下载我们文件varMyStream:TMemoryStream;beginIdAntiFreeze1.OnlyWhenIdle:=False;//设置使有反应.MyStream:=TMemoryStream.Create;tryIdHTTP1.Get(\'/download/Mp3ToExe.zip\',MyStream);//下载我站点个ZIP文件except//INDYControl控件般要使用这种try..except结构.Showmessage(\'网络出错!\');MyStream.Free;Exit;end;MyStream.SaveToFile(\'c:\\Mp3ToExe.zip\');MyStream.Free;Showmessage(\'OK\');end;procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;const AWorkCountMax: Integer);//开始下载前,将ProgressBar1最大值设置为需要接收数据大小.beginProgressBar1.Max:=AWorkCountMax;ProgressBar1.Min:=0;ProgressBar1.Position:=0;end;procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;const AWorkCount: Integer);//接收数据时候,进度将在ProgressBar1显示出来.beginProgressBar1.Position:=ProgressBar1.Position+AWorkCount;end;IdHTTP1Get还有种形式就是获取串:例如,上面可以改写成:procedure TForm1.Button1Click(Sender: TObject);varMyStr:String;beginIdAntiFreeze1.OnlyWhenIdle:=False;//设置使有反应.tryMyStr:=IdHTTP1.Get(\'/default.htm\');exceptShowmessage(\'网络出错!\');Exit;end;Showmessage(MyStr);end;来源:(/s/blog_426a901f0100g904.html) - 网页内容查询控制_星岚_新浪博客Delphi调用Java的Web Service,请指点web service 服务端是用cxf简单实现的,java作为客户度已经能成功调用但用Delphi作为客户端调用时出错Delphi实现客户端时,直接用Delphi自带的wsdl importor生成接口文件先把wsdl贴出来吧XML code<?xml version="1.0"encoding="UTF-8" ?>- <wsdl:definitionsname="HelloWorldImplService"targetNamespace="http:///"xmlns:ns1="http://schem/soap/http"xmlns:soap="http://sche/wsdl/soap/"xmlns:tns="http://serve/"xmlns:wsdl="http://sche/wsdl/"xmlns:xsd="http://www.w/2001/XMLSchema">- <wsdl:types>- <xs:schema elementFormDefault="unqualified" targetNamespace="http:/ //"version="1.0" xmlns:tns="http://serve/" xmlns:xs="http://www.w3 .org/2001/XMLSchema"><xs:elementname="sayHi"type="tns:sayHi"/><xs:element name="sayHiResponse" type="tns:sayHiResponse"/>- <xs:complexTypename="sayHi">- <xs:sequence><xs:elementminOccurs="0"name="text"type="xs:string"/></< span>xs:sequence></<span>xs:complexType>- <xs:complexType name="sayHiResponse">- <xs:sequence><xs:elementminOccurs="0"name="return"type="xs:string"/></< span>xs:sequence></<span>xs:complexType></< span>xs:schema></< span>wsdl:types>- <wsdl:message name="sayHiResponse"><wsdl:part element="tns:sayHiRespo nse" name="parameters"/></< span>wsdl:message>- <wsdl:messagename="sayHi"><wsdl:partelement="tns:sayHi" name="parameters"/></< span>wsdl:message>- <wsdl:portTypename="HelloWorld">- <wsdl perationname="sayHi"><wsdl:input message="tns:sayHi"name="sayHi"/><wsdl utput message="tns:sayHiResponse"name="sayHiResponse"/></< span>wsdlperation></<span>wsdl:portType>- <wsdl:binding name="HelloWorldImplSer viceSoapBinding" type="tns:HelloWorld"><soap:bindingstyle="document" transport="http://schem/soap/http"/>- <wsdl perationname="sayHi"><soap perationsoapAction=""style="document"/>- <wsdl:inputname="sayHi"><soap:bodyuse="literal"/></< span>wsdl:input>- <wsdl utput name="sayHiResponse"><soap:bodyuse="literal"/></< span>wsdl utput></< span>wsdlperation></< span>wsdl:binding>- <wsdl:service name="HelloWorldImplService"> - <wsdl:port binding ="tns:HelloWorld ImplServiceSoapBinding" name ="HelloWorldImplPort"><soap:address location ="http://192.168.3.19:9199/helloWorld"/></< span>wsdl:port ></< span>wsdl:service ></<span>wsdl:definitions >DirectUI 界面开发技术DirectUI 界面开发技术视频教程DirectUI SDK 文档回复 引用TOP元老 发表于 2010-4-13 18:12 | 只看该作者delphi 生成的接口文件Delphi(Pascal) code//********************************** ************************************** //// The types declared in this file were generated from data read fromthe// WSDL File described below:// WSDL :http://192.168.3.19:9199/helloWorld?wsdl// Encoding : UTF-8// Version : 1.0// (2010-4-1216:05:17 - 1.33.2.5)//********************************** ************************************** //unit IntfHelloWorld;interfaceuses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;type//********************************** ************************************** //// The following types, referred to in the WSDL document are not beingrepresented// in this file. They are either aliases[@] of other typesrepresented or were referred// to but never[!] declared in the document. The types from the lattercategory// typically map to predefined/known XML or Borland types; however, they could also// indicate incorrect WSDL documents that failed to declare or import a schema type.//********************************** ************************************** //// !:string - "/2001/XMLSchema"//********************************** ************************************** //// Namespace :/// transport :/soap/http// style : document// binding : HelloWorldImplServiceSoapBinding// service :HelloWorldImplService// port : HelloWorldImplPort// URL :http://192.168.3.19:9199/helloWorld//********************************** ************************************** //HelloWorld =interface(IInvokable)['{FD8A0710-486D-67E2-9EDD-8D2655AA62BC}']function sayHi(const text: WideString): WideString; stdcall;end;function GetHelloWorld(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil):HelloWorld;implementationfunction GetHelloWorld(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): HelloWorld;constdefWSDL ='http://192.168.3.19:9199/helloWorld?wsdl';defURL ='http://192.168.3.19:9199/helloWorld';defSvc ='HelloWorldImplService';defPrt = 'HelloWorldImplPort';varRIO: THTTPRIO;beginResult := nil;if (Addr = '') thenbeginif UseWSDL thenAddr := defWSDLelseAddr := defURL;end;if HTTPRIO = nil thenRIO := THTTPRIO.Create(nil)elseRIO := HTTPRIO;tryResult := (RIO as HelloWorld);if UseWSDL thenbeginRIO.WSDLLocation := Addr;RIO.Service := defSvc;RIO.Port := defPrt;end elseRIO.URL := Addr;finallyif(Result = nil) and(HTTPRIO =nil) thenRIO.Free;end;end;initializationInvRegistry.RegisterInterface(TypeInfo(HelloWorld),'/','UTF-8');InvRegistry.RegisterDefaultSOAPAction(TypeInfo(HelloWorld), '');InvRegistry.RegisterInvokeOptions(TypeInfo(HelloWorld),ioDocument);end.// ************************************************************************ / /// The types declared in this file were generated from data read from the// WSDL File described below:// WSDL : http://localhost/ServiceTest/Service.asmx?wsdl// Encoding : utf-8// Version : 1.0// (2005-12-17 1:49:46 - 1.33.2.5)// ************************************************************************ / /unit Service;interfaceuses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;type// ************************************************************************ //// The following types, referred to in the WSDL document are not being represented// in this file. They are either aliases[@] of other types represented or were referred// to but never[!] declared in the document. The types from the la tter category// typically map to predefined/known XML or Borland types; however, they could also// indicate incorrect WSDL documents that failed to declare or importa schema type.// ************************************************************************ //// !:string - "/2001/XMLSchema "// ************************************************************************ //// Namespace : /// soapAction: /HelloWorld// transport : /soap/http// binding : ServiceSoap// service : Service// port : ServiceSoap// URL : http://localhost/ServiceTest/Service.asmx// ************************************************************************ //ServiceSoap = interface(IInvokable)[ '{77573149-9C57-FA51-F11F-EFD527C91BD9} ']function HelloWorld(const user: WideString): WideString; stdcall;end;function GetServiceSoap(UseWSDL: Boolean=System.False; Addr: string= ' '; HTTPRIO: THTTPRIO = nil): ServiceSoap;implementationfunction GetServiceSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRI O): ServiceSoap;constdefWSDL = 'http://localhost/ServiceTest/Service.asmx?wsdl ';defURL = 'http://localhost/ServiceTest/Service.asmx ';defSvc = 'Service ';defPrt = 'ServiceSoap ';varRIO: THTTPRIO;beginResult := nil;if (Addr = ' ') thenbeginif UseWSDL thenAddr := defWSDLelseAddr := defURL;end;if HTTPRIO = nil thenRIO := THTTPRIO.Create(nil)elseRIO := HTTPRIO;tryResult := (RIO as ServiceSoap);if UseWSDL thenbeginRIO.WSDLLocation := Addr;RIO.Service := defSvc;RIO.Port := defPrt;end elseRIO.URL := Addr;finallyif (Result = nil) and (HTTPRIO = nil) thenRIO.Free;end;end;initializationInvRegistry.RegisterInterface(TypeInfo(ServiceSoap), '/ ', 'utf-8 ');InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ServiceSoap), '/Hello World ');end.通过Delphi实现Java调用Oracle数据库数据字号: 小中大| 打印发布: 2009-1-24 22:12 作者: 网络转载来源: 查看: 67次声明声明: 1、任何网站转载本站点内容时需注明来自,否则我们有权将根据《互联网著作权行政保护办法》追究其相应法律责任; 2、JAVA中文站社区刊登此文只为传递信息,并不表示赞同或者反对.通过Delphi实现Java调用Oracle数据库数据---- 在开发WWW网络浏览软件中,时常要用到JAVA画一些生产管理图形,而且大量的图形数据存于网络数据库ORACLE中,现在常用的方法是使用JDBC来实现对数据库的操作,但是,如果手头没有它驱动程序,则就无法对数据库进行操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Delphi 通过MSHTML实现一个HTML解析类Delphi 通过MSHTML实现一个HTML解析类分类:Delphi编程2010-01-05 09:14400人阅读评论(7)收藏举报最近经常会模拟网页提交返回网页源码,然后获得网页中相应的元素,于是需要常常解析Html中相应的各种元素,网络是个好东西,搜索一番,就找到了好几个Delphi版本的HtmlParser的类库,试着使用了几个,发现解析起来都不完整,或多或少的回出现一些问题!于是想到了如果界面上有一个浏览器,我们可以通过WebBrowser的Document接口对网页元素进行操作,很是方便!但是模拟网页提交,界面上是不一定要出现WebBrowser的,肯定有办法,不通过WebBrowser就直接解析HTML的,那便是我不要WebBrowser这个外壳,只要他里面的Document文档接口对象就能实现对Html的解析了,查找了一番MSDN,然后Google一下,果然可行,构建方法如下://创建IHTMLDocument2接口CoCreateInstance(CLASS_HTMLDocument, nil, CLSCTX_INPROC_SERVER, IID_IHTMLDocument2, FHtmlDoc);接口创建好了之后就能够对文档元素进行解析了,很是爽快!结合了我自己的特有操作,我对Combobox,Table,Frame等一些网页元素做了相应的封装,实现了一个HTMLParser,大致代码如下:这里只给出声明,代码请在最后下载代码(******************************************************)(*得闲工作室*)(*网页元素操作类库*)(**)(*DxHtmlElement Unit*)(*Copyright(c) 2008-2010 不得闲*)(*email:appleak46@ QQ:75492895 *)(******************************************************)unitDxHtmlElement;interfaceusesWindows,sysUtils,Clipbrd,MSHTML,ActiveX,OleCtrls,Grap hics,TypInfo;{Get EleMent Type}functionIsSelectElement(eleElement: IHTMLElement): Boolean;functionIsPwdElement(eleElement: IHTMLElement): Boolean;functionIsTextElement(element: IHTMLElement):boolean;functionIsTableElement(element: IHTMLElement):Boolean;functionIsElementCollection(element: IHTMLElement): Boolean;functionIsChkElement(element: IHTMLElement):boolean;functionIsRadioBtnElement(element: IHTMLElement): boolean;functionIsMemoElement(element: IHTMLElement):boolean;functionIsFormElement(element: IHTMLElement):boolean;functionIsIMGElement(element: IHTMLElement):boolean;functionIsInIMGElement(element: IHTMLElement):boolean;functionIsLabelElement(element: IHTMLElement):boolean;functionIsLinkElement(element: IHTMLElement):boolean;functionIsListElement(element: IHTMLElement): boolean;function IsControlElement(element: IHTMLElement):boolean;functionIsObjectElement(element: IHTMLElement):boolean;functionIsFrameElement(element: IHTMLElement):boolean;functionIsInPutBtnElement(element: IHTMLElement): boolean;functionIsInHiddenElement(element: IHTMLElement): boolean;functionIsSubmitElement(element: IHTMLElement): boolean;{ Get ImgElement Data}functionGetPicIndex(doc: IHTMLDocument2; Src:string; Alt:string): Integer;functionGetPicElement(doc: IHTMLDocument2;imgName: string;src:string;Alt:string): IHTMLImgElement;functionGetRegCodePic(doc: IHTMLDocument2;ImgName: string; Src:string; Alt:string): TPicture;overload;functionGetRegCodePic(doc: IHTMLDocument2;Index: integer):TPicture;overload;functionGetRegCodePic(doc: IHTMLDocument2;element: IHTMLIMGElement): TPicture;overload;type TObjectFromLResult=function(LRESULT: lResult;constIID: TIID; WPARAM: wParam;outpObject): HRESULT;stdcall;TEleMentType=(ELE_UNKNOW,ELE_TEXT,ELE_PWD,ELE_SELECT,ELE_CHECKBOX,ELE_RADIOBTN,ELE_MEMO,ELE_FOR M,ELE_IMAGE,ELE_LABEL,ELE_LINK,ELE_LIST,ELE_CONTROL,ELE_ OBJECT,ELE_FRAME,ELE_INPUTBTN,ELE_INIMAGE,E LE_INHIDDEN);functionGetElementType(element: IHTMLELEMENT): TEleMentType;functionGetElementTypeName(element: IHTMLELEMENT): string;functionGetHtmlTableCell(aTable: IHTMLTable;aRow,aCol: Integer): IHTMLElement;functionGetHtmlTable(aDoc: IHTMLDocument2; aIndex: Integer): IHTMLTable;function GetWebBrowserHtmlTableCellText(Doc: IHTMLDocument2;constTableIndex, RowIndex, ColIndex: Integer;varResValue:string): Boolean;functionGetHtmlTableRowHtml(aTable: IHTMLTable; aRow: Integer): IHTMLElement;function GetWebBrowserHtmlTableCellHtml(Doc: IHTMLDocument2;constTableIndex,RowIndex,ColIndex: Integer;varResValue:string): Boolean;functionGeHtmlTableHtml(aTable: IHTMLTable; aRow: Integer): IHTMLElement;function GetWebBrowserHtmlTableHtml(Doc: IHTMLDocument2;constTableIndex,RowIndex: Integer;varResValue:string): Boolean;type TDxWebFrameCollection=class;TDxWebElementCollection=class;TLoadState=(Doc_Loading,Doc_Completed,Doc_Invalidate); TDxWebFrame=private FFrame: IHTMLWINDOW2;FElementCollections: TDxWebElementCollection;FWebFrameCollections: TDxWebFrameCollection;functionGetSrc:string;functionGetElementCount: integer;functionGetWebFrameCollections: TDxWebFrameCollection;GetElementCollections: TDxWebElementCollection;functionGetDocument: IHTMLDOCUMENT2;functionGetReadState: TLoadState;functionGetIsLoaded: boolean;procedureSetFrame(constValue: IHTMLWINDOW2);GetName:string;public Constructor Create(IFrame: IHTMLWINDOW2);Destructor Destroy;override;propertyFrame: IHTMLWINDOW2readFFramewriteSetFrame;propertySrc:stringreadGetSrc;propertyDocument: IHTMLDOCUMENT2 readGetDocument;propertyName:stringreadGetName;propertyFrames: TDxWebFrameCollectionreadGetWebFrameCollections;propertyElementCount: integerreadGetElementCount;propertyElementCollections: TDxWebElementCollection readGetElementCollections;propertyReadyState: TLoadStatereadGetReadState;propertyIsLoaded: booleanreadGetIsLoaded;end; TDxWebFrameCollection=Classprivate FFrameCollection: IHTMLFramesCollection2;Frame: TDxWebFrame;functionGetCount: integer;functionGetFrameInterfaceByIndex(index: integer): IHTMLWINDOW2;functionGetFrameInterfaceByName(Name:string): IHTMLWINDOW2;functionGetFrameByIndex(index: integer): TDxWebFrame;functionGetFrameByName(Name:string): TDxWebFrame;procedureSetFrameCollection(constValue: IHTMLFramesCollection2);public Constructor Create(ACollection: IHTMLFramesCollection2);Destructor Destroy;override;propertyFrameCollection: IHTMLFramesCollection2 readFFrameCollectionwriteSetFrameCollection;propertyCount: integerreadGetCount;propertyFrameInterfaceByIndex[index: integer]: IHTMLWINDOW2 readGetFrameInterfaceByIndex;propertyFrameInterfaceByName[Name:string]: IHTMLWINDOW2readGetFrameInterfaceByName;propertyFrameByIndex[index: integer]: TDxWebFramereadGetFrameByIndex;propertyFrameByName[Name:string]: TDxWebFramereadGetFrameByName;end;TDxWebElementCollection=classprivate FCollection: IHTMLElementCollection;FChildCollection: TDxWebElementCollection;functionGetCollection(index: String): TDxWebElementCollection;functionGetCount: integer;functionGetElement(itemName:string; index: integer): IHTMLElement;functionGetElementByName(itemName:string): IHTMLELEMENT;functionGetElementByIndex(index: integer): IHTMLELEMENT;procedureSetCollection(constValue: IHTMLElementCollection);public Constructor Create(ACollection: IHTMLElementCollection);Destructor Destroy;override;propertyCollection: IHTMLElementCollectionreadFCollectionwriteSetCollection;propertyChildElementCollection[index: String]: TDxWebElementCollectionreadGetCollection;propertyElementCount: integerreadGetCount;propertyElement[itemName:string;index: integer]: IHTMLElementreadGetElement;propertyElementByName[itemName:string]: IHTMLELEMENTreadGetElementByName;propertyElementByIndex[index: integer]: IHTMLELEMENT readGetElementByIndex;end; TLinkCollection=class(TDxWebElementCollection)end;TDxWebTable=class; TDxTableCollection=classprivate FTableCollection: IHTMLElementCollection;FDocument: IHTMLDOCUMENT2;FWebTable: TDxWebTable;GetTableInterfaceByName(AName:string): IHTMLTABLE;procedureSetDocument(Value: IHTMLDOCUMENT2);functionGetTableInterfaceByIndex(index: integer): IHTMLTABLE;functionGetCount: integer;functionGetTableByIndex(index: integer): TDxWebTable;GetTableByName(AName:string): TDxWebTable;public Constructor Create(Doc: IHTMLDOCUMENT2);destructorDestroy;override;propertyTableInterfaceByName[AName:string]: IHTMLTABLEreadGetTableInterfaceByName;propertyTableInterfaceByIndex[index: integer]: IHTMLTABLE readGetTableInterfaceByIndex;propertyTableByName[AName:string]: TDxWebTablereadGetTableByName;propertyTableByIndex[index: integer]: TDxWebTablereadGetTableByIndex;propertyDocument: IHTMLDOCUMENT2readFDocumentwriteSetDocument;propertyCount: integerreadGetCount;end; TDxWebTable=classprivate FTableInterface: IHTMLTABLE; functionGetRowCount: integer;procedureSetTableInterface(constValue: IHTMLTABLE);functionGetCell(ACol, ARow: integer):string;functionGetRowColCount(RowIndex: integer): integer;functionGetInnerHtml:stringfunctionGetInnerText:string;functionGetCellElement(ACol, ARow: Integer): IHTMLTableCell; public Constructor Create(ATable: IHTMLTABLE);propertyTableInterface: IHTMLTABLEreadFTableInterfacewriteSetTableInterface;propertyRowCount: integerreadGetRowCount;propertyCell[ACol: integer;ARow: integer]:stringreadGetCell;propertyCellElement[ACol: Integer;ARow: Integer]: IHTMLTableCellreadGetCellElement;propertyRowColCount[RowIndex: integer]: integer readGetRowColCount;propertyInnerHtml:stringreadGetInnerHtml;propertyInnerText:stringreadGetInnerText;end; TDxWebCombobox=classprivate FHtmlSelect: IHTMLSelectElement;functionGetCount: Integer;procedureSetItemIndex(constValue: Integer);functionGetItemIndex: Integer;function GetName: string;procedure SetName( const Value: string);function GetValue: string; procedureSetValue(constValue:string);procedure SetCombInterface(constValue: IHTMLSelectElement);functionGetItemByName(EleName: string):string;functionGetItemByIndex(index: integer):string;functionGetItemAttribute(index: Integer; AttribName: string): OleVariant;publicconstructorCreate(AWebCombo: IHTMLSelectElement);procedureAdd(Ele: IHTMLElement);procedureInsert(Ele: IHTMLElement;Index: Integer);procedureRemove(index: Integer);propertyCombInterface: IHTMLSelectElement readFHtmlSelectwriteSetCombInterface;propertyCount: IntegerreadGetCount;propertyItemIndex: IntegerreadGetItemIndexwriteSetItemIndex;propertyItemByIndex[index: integer]: stringreadGetItemByIndex;propertyItemByName[EleName: string]:stringreadGetItemByName;propertyItemAttribute[index: Integer;AttribName: string]: OleVariantreadGetItemAttribute;propertyName:stringreadGetNamewriteSetName;propertyvalue:stringGetValuewriteSetValue;end;implementationend.HTMLParser解析类的代码实现单元代码(***************************************************** *)(*得闲工作室*)(*HTML解析单元库*)(*DxHtmlParser Unit*)(*Copyright(c) 2008-2010 不得闲*)(*email:appleak46@ QQ:75492895 *)(******************************************************)unitDxHtmlParser;interfaceusesWindows,MSHTML,ActiveX,DxHtmlElement,Forms;type TDxHtmlParser=classprivate FHtmlDoc: IHTMLDocument2;FHTML:stringFWebTables: TDxTableCollection;FWebElements: TDxWebElementCollection;FWebComb: TDxWebCombobox;procedureSetHTML(constValue:string);functionGetWebCombobox(AName:string): TDxWebCombobox;public constructor Create;destructor Destroy; override;property HTML: stringread FHTML write SetHTML;propertyWebTables: TDxTableCollectionreadFWebTables;propertyWebElements: TDxWebElementCollection readFWebElements;propertyWebCombobox[Name:string]: TDxWebComboboxreadGetWebCombobox;end;implementation{TDxHtmlParser}constructorTDxHtmlParser.Create;begin CoInitialize(nil);//创建IHTMLDocument2接口CoCreateInstance(CLASS_HTMLDocument,nil, CLSCTX_INPROC_SERVER, IID_IHTMLDocument2, FHtmlDoc);Assert(FHtmlDoc<>nil,'构建HTMLDocument接口失败');FHtmlDoc.Set_designMode( 'On');//设置为设计模式,不执行脚本whilenot(FHtmlDoc.readyState='complete')dobegin sleep(1);Application.ProcessMessages;end;FWebTables :=TDxTableCollection.Create(FHtmlDoc);FWebElements :=TDxWebElementCollection.Create(nil);FWebComb :=TDxWebCombobox.Create(nil);end;destructorTDxHtmlParser.Destroy;begin FWebTables.Free; FWebElements.Free;FWebComb.Free;CoUninitialize;inherited;end;functionTDxHtmlParser.GetWebCombobox(AName:string): TDxWebCombobox;beginifFWebElements.Collection<>nilthenbegin bInterface :=FWebElements.ElementByName[AName] asIHTMLSelectElement;Result :=FWebComb;endelseResult :=nil;end。