如果你是需要在TWebBrowser控件里直接显示网页源代码,这样做: (转) unit MA;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, SHDocVw, StdCtrls, Psock, ComObj;type TForm1 = class(TForm) WB1: TWebBrowser; b1: TButton; urltext: TEdit; listurl: TEdit; Memo1: TMemo; procedure b1Click(Sender: TObject); procedure WB1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); private { Private declarations } public { Public declarations } end;{ IPersistStream interface }{$EXTERNALSYM IPersistStream} IPersistStream = interface(IPersist) ['{00000109-0000-0000-C000-000000000046}'] function IsDirty: HResult; stdcall;function Load(const stm: IStream): HResult; stdcall; // 从流中载入 function Save(const stm: IStream; fClearDirty: BOOL): HResult; stdcall; // 保存到流 function GetSizeMax(out cbSize: Largeint): HResult; stdcall; // 取得保存所需空间大小 end;{ IPersistStreamInit interface }{$EXTERNALSYM IPersistStreamInit} IPersistStreamInit = interface(IPersistStream) ['{7FD52380-4E07-101B-AE2D-08002B2EC713}'] function InitNew: HResult; stdcall; // 初始化 end; var Form1: TForm1;implementation{$R *.DFM} function GetHtml(const WebBrowser: TWebBrowser): string; const BufSize = $10000; var Size: Int64; Stream: IStream; hHTMLText: HGLOBAL; psi: IPersistStreamInit; begin if not Assigned(WebBrowser.Document) then Exit;OleCheck(WebBrowser.Document.QueryInterface (IPersistStreamInit, psi)); try //OleCheck(psi.GetSizeMax(Size)); hHTMLText := GlobalAlloc(GPTR, BufSize); if 0 = hHTMLText then RaiseLastWin32Error;OleCheck(CreateStreamOnHGlobal(hHTMLText, True, Stream)); try OleCheck(psi.Save(Stream, False));Size := StrLen(PChar(hHTMLText)); SetLength(Result, Size); CopyMemory(PChar(Result), Pointer(hHTMLText), Size); finally Stream := nil; end; finally psi := nil; end; end;procedure TForm1.b1Click(Sender: TObject); begin WB1.Navigate(urltext.text); end;procedure TForm1.WB1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); var p:Ansistring;beginp:=WB1.LocationURL; listurl.text:=p; Memo1.text:=GetHtml(Wb1);end;
down internet 文件,有一个函数。记得加入 uses URLMon; 下载文件函数。 function DownloadFile(Source, Dest: string): Boolean; begin try Result := UrlDownloadToFile(nil, PChar(source), PChar(Dest), 0, nil) = 0; except Result := False; end; end; 调用例子。 if DownloadFile ('http://go8.163.com/cokegirl/CCTV-1/cctv1_010611_7/cctv1_010611.xml', 'c:\Temp\cctv1_010611.xml') then ShowMessage('Download succesful') else ShowMessage('Download unsuccesful')
Laza, Thank you! 我试过了,真的down下来了!就是有一点,本来每一行都分得很清楚的原码,down下来之后变得都成了一行似的,需要用写字板打开再另存为.txt文件,去掉其中的格式符才行。这是为什么呢?rh, Thank you very much!只是你给的代码挺长的,我正做着实验呢。
这样处理一下就没问题了。var List: TStringList; begin List := TStringList.Create; List.LoadFromFile('c:\Temp\cctv1_010611.xml'); List.SaveToFile('c:temp\xxx.xml');//文件名同名也可。 List.Free; end;
laza, OK, 搞定。Thanx. an other question, 能不能不用存成.xml文件,只是将它读到一个TStringList中,然后我把它处理一番,放到数据库里,可不可以呢?
高手指路呀。
做完这个东东后,我一定升级!::)
不过,我还是想知道怎样使用XML ver 2.6提供的接口或者其他比较笨/低级的方法来解决。
What shall I do?
竹儿:
FlashGet:是一个,类netants,的下载软件,对你的要作东东没用的。
我用WebBrowser,其实是一个用了ie解析了的,浏览控件。
我想,你作的东西,应该是yong用FastNet控件组中的TNMHttp,取得你要用到的,xml文件,然后,自己解析取到的文件,是这样吗?
我不太明白的是,在取出.xml文件之后,在webbrowser上点右键 ->查看源文件,就可以看见原版的xml文件格式,在程序中,我应该怎样写,或者使用那种接口才能读出这个原版的xml文件呢?
另外,你说的用FastNet中的TNMHttp取xml文件,hehe,惭愧,因为刚刚学习用Delphi做和Internet有关的东东,我还不知道TNMHttp怎么用呢。
其实,我要解析的.xml文件就放在 http://go.163.com/cokegirl 下面呢,我的开发机是Windows 2000, 使用代理服务器上网,每次连接到Internet时,都需要输入再我们这个局域网的用户及口令。所以我不太敢用TNMHttp,我担心TNMHttp处理不了这种连接Internet的情况。
使用其get方法
demos\fastnet\http 下的代码
使用其里面的get example
填入http://go8.163.com/cokegirl/CCTV-1/cctv1_010611_7/cctv1_010611.xml
获得以下信息, 看看是不是你需要的:
//-------------------------------------
//这里是http传输的信息,可以不管之
HTTP/1.1 200 OK
Date: Thu, 21 Jun 2001 02:56:17 GMT
Server: Apache/1.3.19 (Unix) mod_layout/2.10.1
Last-Modified: Fri, 15 Jun 2001 06:52:52 GMT
ETag: "23a9dfe-341-3b29b0c4"
Accept-Ranges: bytes
Content-Length: 833
Connection: close
Content-Type: text/xml//----------------------------------
//下面是获得的文档本身,应该就是你需要的了
<?xml version="1.0" encoding="GB2312"?>
<ProgramList>
<Channel>CCTV-1</Channel>
<PlayDate>2001-06-11</PlayDate> <PlayTime>06:00</PlayTime>
<ProgramName>东方时空:东方时空早新闻(一)</ProgramName> <PlayTime>07:00</PlayTime>
<ProgramName>东方时空:早新闻(二)</ProgramName> <PlayTime>08:00</PlayTime>
<ProgramName>东方时空:早新闻(三)</ProgramName> <PlayTime>08:35</PlayTime>
<ProgramName>焦点访谈</ProgramName> <PlayTime>08:50</PlayTime>
<ProgramName>夕阳红</ProgramName> <PlayTime>09:20</PlayTime>
<ProgramName>专题片10集专题片:瞿秋白(4)</ProgramName> <PlayTime>09:45</PlayTime>
<ProgramName>每日一歌:为了谁</ProgramName> <PlayTime>09:50</PlayTime>
<ProgramName>科技博览(2001--161)</ProgramName> <PlayTime>10:00</PlayTime>
<ProgramName>科技博览(2001--161)</ProgramName></ProgramList>
(转)
unit MA;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OleCtrls, SHDocVw, StdCtrls, Psock, ComObj;type
TForm1 = class(TForm)
WB1: TWebBrowser;
b1: TButton;
urltext: TEdit;
listurl: TEdit;
Memo1: TMemo; procedure b1Click(Sender: TObject);
procedure WB1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant); private
{ Private declarations }
public
{ Public declarations }
end;{ IPersistStream interface }{$EXTERNALSYM IPersistStream}
IPersistStream = interface(IPersist)
['{00000109-0000-0000-C000-000000000046}']
function IsDirty: HResult; stdcall;function Load(const stm: IStream): HResult; stdcall;
// 从流中载入
function Save(const stm: IStream;
fClearDirty: BOOL): HResult; stdcall;
// 保存到流
function GetSizeMax(out cbSize: Largeint):
HResult; stdcall; // 取得保存所需空间大小
end;{ IPersistStreamInit interface }{$EXTERNALSYM IPersistStreamInit}
IPersistStreamInit = interface(IPersistStream)
['{7FD52380-4E07-101B-AE2D-08002B2EC713}']
function InitNew: HResult; stdcall; // 初始化
end;
var
Form1: TForm1;implementation{$R *.DFM}
function GetHtml(const WebBrowser:
TWebBrowser): string;
const
BufSize = $10000;
var
Size: Int64;
Stream: IStream;
hHTMLText: HGLOBAL;
psi: IPersistStreamInit;
begin
if not Assigned(WebBrowser.Document) then Exit;OleCheck(WebBrowser.Document.QueryInterface
(IPersistStreamInit, psi));
try
//OleCheck(psi.GetSizeMax(Size));
hHTMLText := GlobalAlloc(GPTR, BufSize);
if 0 = hHTMLText then RaiseLastWin32Error;OleCheck(CreateStreamOnHGlobal(hHTMLText,
True, Stream));
try
OleCheck(psi.Save(Stream, False));Size := StrLen(PChar(hHTMLText));
SetLength(Result, Size);
CopyMemory(PChar(Result), Pointer(hHTMLText),
Size);
finally
Stream := nil;
end;
finally
psi := nil;
end;
end;procedure TForm1.b1Click(Sender: TObject);
begin
WB1.Navigate(urltext.text);
end;procedure TForm1.WB1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
p:Ansistring;beginp:=WB1.LocationURL;
listurl.text:=p;
Memo1.text:=GetHtml(Wb1);end;
下载文件函数。 function DownloadFile(Source, Dest: string): Boolean;
begin
try
Result := UrlDownloadToFile(nil, PChar(source), PChar(Dest), 0, nil) = 0;
except
Result := False;
end;
end;
调用例子。 if DownloadFile ('http://go8.163.com/cokegirl/CCTV-1/cctv1_010611_7/cctv1_010611.xml', 'c:\Temp\cctv1_010611.xml') then
ShowMessage('Download succesful')
else
ShowMessage('Download unsuccesful')
List: TStringList;
begin
List := TStringList.Create;
List.LoadFromFile('c:\Temp\cctv1_010611.xml');
List.SaveToFile('c:temp\xxx.xml');//文件名同名也可。
List.Free;
end;
OK, 搞定。Thanx. an other question, 能不能不用存成.xml文件,只是将它读到一个TStringList中,然后我把它处理一番,放到数据库里,可不可以呢?
var
List: TStringList;
begin
try
Result := UrlDownloadToFile(nil, PChar(source), PChar(Dest), 0, nil) = 0;
List := TStringList.Create;
List.LoadFromFile('c:\Temp\cctv1_010611.xml');
{在这里处理}
//List.SaveToFile('c:temp\xxx.xml');
List.Free; except
Result := False;
end;
end;
不过,还是希望大家能够多多讨论。