首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

delphi用TXMLDocument解析XML文件内存漏洞有关问题

2012-02-16 
delphi用TXMLDocument解析XML文件内存漏洞问题Delphi高手请帮忙看看关于内存的问题我用TXMLDocument扫描大

delphi用TXMLDocument解析XML文件内存漏洞问题
Delphi高手请帮忙看看关于内存的问题
我用TXMLDocument扫描大量XML文件后内存显著增加
扫描500个XML文件(文件总大小200M左右)内存增长4M左右,扫描20万个XML文件(文件总大小1G多)内存增长150M左右,
请高手看看哪儿内存没释放干净。谢谢
源程序如下:


unit   Unit1;

interface

uses
    Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,
    Dialogs,   xmldom,   XMLIntf,   msxmldom,   XMLDoc,   StdCtrls;

type
    TForm1   =   class(TForm)
        Button1:   TButton;
        dblist:   TXMLDocument;
        db:   TXMLDocument;
        ind:   TXMLDocument;
        procedure   Button1Click(Sender:   TObject);
        procedure   scanlm(lmname:String);
        procedure   scandb(dbname:String);
        procedure   Button2Click(Sender:   TObject);
    private
        {   Private   declarations   }
    public
        {   Public   declarations   }
    end;

var
    Form1:   TForm1;

implementation

{$R   *.dfm}
procedure   TForm1.scanlm(lmname:String);
var
    node:IXMLNode;
    temp:String;
    indx:TXMLDocument;
begin
    indx:=TXMLDocument.Create(application);
    if   FileExists(lmname)   then
        indx.LoadFromFile(lmname)
    else
        exit;
    node:=indx.ChildNodes.First;
    node:=node.NextSibling;
    node:=node.ChildNodes.First;
    while   node <> nil   do
        begin
            temp:=node.GetAttributeNS( '文献名称 ', ' ');
            node:=node.NextSibling;
        end;    
    Freeandnil(node);
    indx.free;
end;

procedure   TForm1.scandb(dbname:String);
var
    node:IXMLNode;
    lmname:String;
    dbx:TXMLDocument;
begin
    dbx:=TXMLDocument.Create(application);
    dbx.LoadFromFile(dbname);
    node:=dbx.ChildNodes.First.ChildNodes.First;
    while   node <> nil   do
        begin
            lmname:=node.GetAttributeNS( '别名 ', ' ');
            scanlm( 'doc\ '+lmname+ '\index.xml ');
            node:=node.NextSibling;
        end;
    Freeandnil(node);
    dbx.Free;
end;


procedure   TForm1.Button1Click(Sender:   TObject);
var
    node:IXMLNode;
    dbname,ttt:String;
    dblistx:TXMLDocument;
begin
ttt:=timetostr(now());
dblistx:=TXMLDocument.Create(application);
dblistx.LoadFromFile( 'dblist.xml ');
node:=dblistx.ChildNodes.First.ChildNodes.First;
while   node <> nil   do
    begin


        dbname:=node.GetAttributeNS( '数据库名 ', ' ');
//         showmessage(dbname);
        scandb(dbname+ '.xml ');
        node:=node.NextSibling;
    end;  
    Freeandnil(node);
dblistx.Free;
showmessage(ttt+#13+timetostr(now()));
end;

procedure   TForm1.Button2Click(Sender:   TObject);
var
    i:integer;
    t:String;
    x:TXMLDocument;
begin
    x:=TXMLDocument.Create(application);
    x.LoadFromFile( 'dblist.xml ');
    showmessage(x.ChildNodes.First.NodeName);
end;

end.


[解决办法]
我前面说的三处改动应该是三类改动,所有TXMLDocument声明的变量都要改


另外,在DELPHI的IMPORT TYPE LIBRARY
里面找Microsoft XML v....,从这里可以看出系统中安装了哪些版本的MSXML DOM.

我不清楚XP缺省会装哪些版本的MSXML DOM,不过安装很多软件都会附带安装MSXML DOM,
也可以单独从MS网站下载


热点排行