使用XMLDocment遍歷CSDN論壇帖子回復
一天在水園看到別人整理的水園語錄,就是把某人一個時間段在論壇參與的回復都整理在一塊,頓時感到心血來潮,自己何不也整一個,在必要的時候可以討好自己中意的MM,呵呵也可以多了解一些別人,何樂而不為啊 :)
仔細研究了一下論壇的文件格式都是XML的,Delphi6不是自帶有一個XmlDocument控件嗎?可以很方便的對XML文件進行讀取,研究了幾篇相關的文章,自己就動手開始做起來,花了二個多小時基本搞定,唯一的缺陷就是速度有點慢,遍歷2000個帖子大概需要5分鐘左右,那為兄弟有時間可以幫忙給完善一下,例如做成多線程什麼的,我實在是懶得改進了,呵呵,廢話少說,現貼出部分的代碼,主要完成對特定作者的回復進行搜索,其他通過設定關鍵字、論壇編號、時間段檢索大家可以自己完善。
主要代碼部分:
窗體上主要有4個文本框,一個memo控件和二個按扭
通過指定帖子起始編號、結束編號和作者名稱,點“search”按扭,就可以將結果顯示到memo框中。
unit XMLDocSearch;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, xmldom, XMLIntf, msxmldom, XMLDoc, ComCtrls;
const
url='http://expert.csdn.Net/Expert/topic/';
type
TFormTest = class(TForm)
MemoOutput: TMemo;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Button2: TButton;
XMLDoc: TXMLDocument;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
StartID,EndID :LongInt;
KeyWord,Author :string;
public
{ Public declarations }
end;
var
FormTest: TFormTest;
implementation
uses SearchThread;
{$R *.dfm}
procedure TFormTest.Button1Click(Sender: TObject);
顯示格式:
{# # # 搜索范圍:489000--493000# # #
帖子ID:489353
回復者:傻傻貓
回復時間:2002-1-21 10:48:45
內容:
等一下吧。我發個短消息問她
# # # # # # # # # # # # # # # # # # # # # # # #
}
var
Root,CurNode,ChildNode :IXMLNode; //根結點,當前節點,子節點
sStr, sStrReturn: String;
TopicID,ReplyName,ReplyNickName,ReplyTime,ReplyContent :string;
//主題編號,回復人名稱,回復人呢稱,回復時間,回復內容
CurUrl :PChar;
dtr,dts,dte : TDateTime;
min : double;
CurID :integer; //當前編號
begin
dts :=now; //開始時間
StartID :=strtoint(edit3.Text);
EndID :=strtoint(edit4.Text);
KeyWord :=trim(edit1.Text);
Author :=trim(edit2.Text);
MemoOutput.Clear;
sStrReturn := Chr(13) + Chr(10);
sStr :='# # # 搜索范圍:'+inttostr(StartID)+'--'+inttostr(EndID)+'# # #'+sStrReturn+sStrReturn;
MemoOutput.SetSelTextBuf(PChar(sStr));
for CurID:=StartID to EndID do
begin
TopicID :=inttostr(CurID);
CurUrl :=PChar(Url+copy(TopicID,1,length(TopicID)-3)+'/'+TopicID+'.XML');
XMLdoc.LoadFromFile(CurUrl);
XMLdoc.Active :=true;
Root :=xmldoc.DocumentElement; //取XML文件的根結點,即Topic
CurNode :=Root.ChildNodes['Replys']; //使當前節點指向第二個子節點Replys
CurNode :=CurNode.ChildNodes.First; //使當前節點指向Replys節點的第一個子節點信息
while (CurNode<>nil) do //循環讀取多個Reply信息
begin
if CurNode.ChildNodes['PostUserName'].Text =Author then
begin
ChildNode :=CurNode.ChildNodes.First ; //使ChildNode指向該Reply的第一個子節點信息
while (ChildNode<>nil) do //循環讀取Reply的各個子節點
begin
if (ChildNode.NodeName ='PostUserName') then
ReplyName :=ChildNode.Text
else if (ChildNode.NodeName ='PostUserNickName') then
ReplyNickName :=ChildNode.Text
else if (ChildNode.NodeName ='PostDateTime') then
ReplyTime :=ChildNode.Text
else if (ChildNode.NodeName ='Content') then
ReplyContent :=trim(ChildNode.Text);
ChildNode:=ChildNode.NextSibling ; //順序取下一個Reply的子節點信息
end;
sStr :='帖子ID:'+TopicID+sStrReturn;
sStr :=sStr+'回復者:'+ReplyName+'('+ReplyNickName+')'+sStrReturn;
sStr :=sStr+'回復時間:'+ReplyTime+sStrReturn;
sStr :=sStr+'內容:'+sStrReturn+sStrReturn+ReplyContent+sStrReturn+sStrReturn;
sStr :=sStr+'# # # # # # # # # # # # # # # # # # # # # # # #';
sStr :=sStr+sStrReturn;
MemoOutput.SetSelTextBuf(PChar(sStr));
end;
CurNode :=CurNode.NextSibling; //順序取下一個Reply信息
end;
// xmldoc.SaveToFile('.down'+TopicID+'.XML'); //保存文件
end;
dte :=now; //結束時間
dtr :=dte-dts;
min :=dtr*24*60*60;
showmessage('總共使用了'+floattostr(min)+'秒!');
end;
procedure TFormTest.Button2Click(Sender: TObject);
begin
close;
end;