检索XML文件的效率问题(附源码,请大家帮忙对症下药)(100分)

大毛

Unregistered / Unconfirmed
GUEST, unregistred user!
写了一个比较长的函数,用于检索XML文件。
将节点的text取回,用了For循环和嵌套if语句进行了判断,
然后将检索结果写入一个临时的空XMl文件中,并在WebBrowser中显示出来。
最后将此临时XML文件中新添的节点清除。
使用了IXMLDOMDocument的若干方法用于取节点集IXMLNodesName,IXMLNodesAlias等和清空节点;
使用TXMLDocument控件的若干方法用于写XML文件。
由于本人初学编程,代码写的很不规范(包括命名,对象创建及释放)。
肯定各位提出各种可能的意见!!!

procedure TMain.Search_m(XmlDom: IXMLDOMDocument);
var
is_name,is_type: Boolean;
use_name,use_type: Boolean;
i: integer;
temp_path,NodeName: string;
IXMLNodesName,IXMLNodesAlias,IXMLNodesType,IXMLNodesEng: IXMLDOMNodeList;
xnode,xnode1,
xnode4,xnode5,
xnode6: IXMLNode;
do
mEle: IXMLDOMElement;
begin
is_name := false;
is_type := false;
use_name := Form_Medicine.RadioButton1.Checked or Form_Medicine.RadioButton2.Checked or Form_Medicine.RadioButton3.Checked;
use_type := Form_Medicine.CheckBox1.Checked;
NodeName := XmlDom.lastChild.nodeName;
//取回目录名
IXMLNodesName := XmlDom.selectNodes( NodeName+'/类别/子类别/药品/药品名');
IXMLNodesAlias := XmlDom.selectNodes(NodeName+'/类别/子类别/药品/别名');
IXMLNodesType := XmlDom.selectNodes(NodeName+'/类别/子类别/药品/剂型');
IXMLNodesEng := XmlDom.selectNodes(NodeName+'/类别/子类别/药品/英文名');
temp_path := ExtractFilePath(ldb_file);
XMLSearch.LoadFromFile(temp_path + 'Medicine.xml');

//这里进行循环,length至多1000
for i := 0 to IXMLNodesName.length - 1do
begin
if Form_Medicine.RadioButton1.Checked then
begin
NodeName := IXMLNodesName.text;
if StrPos(PChar(NodeName),PChar(Form_Medicine.Edit_name.Text)) <> nil then
begin
is_name := true;
end;
end;

if Form_Medicine.RadioButton2.Checked then
begin
NodeName := IXMLNodesAlias.text;
if StrPos(PChar(IXMLNodesAlias.text),PChar(Form_Medicine.Edit_alias.Text)) <> nil then
begin
is_name := true;
end;
end;

if Form_Medicine.RadioButton3.Checked then
begin
NodeName := IXMLNodesEng.text;
if StrPos(PChar(IXMLNodesEng.text),PChar(Form_Medicine.Edit_eng.Text)) <> nil then
begin
is_name := true;
end;
end;

if Form_Medicine.RadioButton4.Checked then
begin
use_name := false;
end;

if Form_Medicine.CheckBox1.Checked then
begin
NodeName := IXMLNodesType.text;
if StrPos(PChar(NodeName),PChar(Form_Medicine.Edit_type.Text)) <> nil then
begin
is_type := true;
end;
end;

//这里开始判断,并写XML文件(添加各节点)
if is_name and use_name and is_type and use_type then
begin
xnode := XMLSearch.DocumentElement.AddChild('药品');
xnode1 := xnode.AddChild('药品名');
xnode1.Text := IXMLNodesName.text;
if IXMLNodesAlias <> nil then
begin
xnode4 := xnode.AddChild('别名');
xnode4.Text := IXMLNodesAlias.text;
end;
xnode5 := xnode.AddChild('剂型');
xnode5.Text := IXMLNodesType.text;
if IXMLNodesEng <> nil then
begin
xnode6 := xnode.AddChild('英文名');
xnode6.Text := IXMLNodesEng.text;
end;
end;

if (not use_name) and is_type and use_type then
begin
xnode := XMLSearch.DocumentElement.AddChild('药品');
xnode1 := xnode.AddChild('药品名');
xnode1.Text := IXMLNodesName.text;
if IXMLNodesAlias <> nil then
begin
xnode4 := xnode.AddChild('别名');
xnode4.Text := IXMLNodesAlias.text;
end;
xnode5 := xnode.AddChild('剂型');
xnode5.Text := IXMLNodesType.text;
if IXMLNodesEng <> nil then
begin
xnode6 := xnode.AddChild('英文名');
xnode6.Text := IXMLNodesEng.text;
end;
end;

if (not use_type) and is_name and use_name then
begin
xnode := XMLSearch.DocumentElement.AddChild('药品');
xnode1 := xnode.AddChild('药品名');
xnode1.Text := IXMLNodesName.text;
if IXMLNodesAlias <> nil then
begin
xnode4 := xnode.AddChild('别名');
xnode4.Text := IXMLNodesAlias.text;
end;
xnode5 := xnode.AddChild('剂型');
xnode5.Text := IXMLNodesType.text;
if IXMLNodesEng <> nil then
begin
xnode6 := xnode.AddChild('英文名');
xnode6.Text := IXMLNodesEng.text;
end;
end;
is_name := false;
is_type := false;
XMLSearch.SaveToFile();
WebBrowser1.Navigate(temp_path + 'Medicine.xml');
Application.ProcessMessages;
end;

//这里是使检索完毕后,将临时文件添加的节点清除
IXML3 := XmlDomDoc^.Create();
IXML3.load(temp_path + 'Medicine.xml');
IXML3.removeChild(IXML3.documentElement);
do
mEle := IXML3.createElement('药品目录');
IXML3._Set_documentElement(DomEle);
IXML3.save(temp_path + 'Medicine.xml');

end;
 
补充一下,上述代码执行效率很差:大概有1000条药品,2分钟左右才能检索完毕!!!
大毛水平欠佳,实在不知问题发生在何处。
 
发个xml文件试验如何?
 
XML文件太长,短了又看不出什么效果!
给您发邮箱里行吗?
 
jianl,能否留您的邮箱?
 
jianl@163.net
 
问题其实已经解决。
上边的代码,不管怎么改,执行效率都不如直接写xsl文件检索来的快。
请看:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1763219

***************************************************************
另,此帖也该结了,但我分数该怎么分配阿?
全给jian1还是我也收回点?
 
又多看了几眼,用XSL实现了文档的检索,几乎感觉不出速度有问题。
帖子结了吧,先!
 
顶部