用delphi6的TXMLDocument空件解析xml文档,生成树型结构 procedure TForm1.Button5Click(Sender: TObject); begin opendialog1.InitialDir := extractfilepath(application.ExeName); if opendialog1.Execute then begin xmldoc.LoadFromFile(opendialog1.FileName ); treeview1.Items.Clear ; domtotree(xmldoc.DocumentElement ,nil); treeview1.FullExpand ; end; end;procedure tform1.domtotree(xmlnode : ixmlnode; treenode : ttreenode); var i : integer; newtreenode : ttreenode; nodetext : string; attrnode : ixmlnode; begin if xmlnode.NodeType = ntcdata then begin nodetext := xmlnode.NodeName ;// .NodeName ; // showmessage(xmlnode.text); nodetext := nodetext+'='+xmlnode.xml ; newtreenode:= treeview1.Items.AddChild(treenode,nodetext); for i:=0 to xmlnode.AttributeNodes.Count -1 do begin attrnode := xmlnode.AttributeNodes.Nodes[i]; treeview1.Items.AddChild(newtreenode,'['+attrnode.NodeName +'='+attrnode.text +']'); end; if xmlnode.HasChildNodes then for I:=0 to xmlnode.ChildNodes.Count -1 do domtotree(xmlnode.ChildNodes.Nodes[i],newtreenode); end else begin nodetext := xmlnode.LocalName;// .NodeName ; if xmlnode.IsTextElement then nodetext := nodetext+'='+xmlnode.xml ; newtreenode:= treeview1.Items.AddChild(treenode,nodetext); for i:=0 to xmlnode.AttributeNodes.Count -1 do begin attrnode := xmlnode.AttributeNodes.Nodes[i]; treeview1.Items.AddChild(newtreenode,'['+attrnode.NodeName +'='+attrnode.text +']'); end; if xmlnode.HasChildNodes then for I:=0 to xmlnode.ChildNodes.Count -1 do domtotree(xmlnode.ChildNodes.Nodes[i],newtreenode); end;end;
上面那个comtotree的precedure可以简化成procedure tform1.domtotree(xmlnode : ixmlnode; treenode : ttreenode); var i : integer; newtreenode : ttreenode; nodetext : string; attrnode : ixmlnode; begin if xmlnode.NodeType = ntElement then begin nodetext := xmlnode.LocalName ; if xmlnode.IsTextElement then nodetext := nodetext+'='+xmlnode.Text else if xmlnode.ChildNodes.Nodes[0].NodeType=ntcdata then nodetext := nodetext+'='+xmlnode.ChildNodes.Nodes[0].NodeValue ;// newtreenode:= treeview1.Items.AddChild(treenode,nodetext); for i:=0 to xmlnode.AttributeNodes.Count -1 do begin attrnode := xmlnode.AttributeNodes.Nodes[i]; treeview1.Items.AddChild(newtreenode,'['+attrnode.NodeName +'='+attrnode.text +']'); end; if xmlnode.HasChildNodes then for I:=0 to xmlnode.ChildNodes.Count -1 do domtotree(xmlnode.ChildNodes.Nodes[i],newtreenode); end;end;
procedure TForm1.Button5Click(Sender: TObject);
begin
opendialog1.InitialDir := extractfilepath(application.ExeName);
if opendialog1.Execute then
begin
xmldoc.LoadFromFile(opendialog1.FileName );
treeview1.Items.Clear ;
domtotree(xmldoc.DocumentElement ,nil);
treeview1.FullExpand ;
end;
end;procedure tform1.domtotree(xmlnode : ixmlnode; treenode : ttreenode);
var
i : integer;
newtreenode : ttreenode;
nodetext : string;
attrnode : ixmlnode;
begin
if xmlnode.NodeType = ntcdata then
begin
nodetext := xmlnode.NodeName ;// .NodeName ;
// showmessage(xmlnode.text);
nodetext := nodetext+'='+xmlnode.xml ; newtreenode:= treeview1.Items.AddChild(treenode,nodetext); for i:=0 to xmlnode.AttributeNodes.Count -1 do
begin
attrnode := xmlnode.AttributeNodes.Nodes[i];
treeview1.Items.AddChild(newtreenode,'['+attrnode.NodeName +'='+attrnode.text +']');
end; if xmlnode.HasChildNodes then
for I:=0 to xmlnode.ChildNodes.Count -1 do
domtotree(xmlnode.ChildNodes.Nodes[i],newtreenode); end else
begin nodetext := xmlnode.LocalName;// .NodeName ;
if xmlnode.IsTextElement then
nodetext := nodetext+'='+xmlnode.xml ; newtreenode:= treeview1.Items.AddChild(treenode,nodetext); for i:=0 to xmlnode.AttributeNodes.Count -1 do
begin
attrnode := xmlnode.AttributeNodes.Nodes[i];
treeview1.Items.AddChild(newtreenode,'['+attrnode.NodeName +'='+attrnode.text +']');
end; if xmlnode.HasChildNodes then
for I:=0 to xmlnode.ChildNodes.Count -1 do
domtotree(xmlnode.ChildNodes.Nodes[i],newtreenode);
end;end;
var
i : integer;
newtreenode : ttreenode;
nodetext : string;
attrnode : ixmlnode;
begin if xmlnode.NodeType = ntElement then
begin
nodetext := xmlnode.LocalName ;
if xmlnode.IsTextElement then
nodetext := nodetext+'='+xmlnode.Text
else if xmlnode.ChildNodes.Nodes[0].NodeType=ntcdata then
nodetext := nodetext+'='+xmlnode.ChildNodes.Nodes[0].NodeValue ;// newtreenode:= treeview1.Items.AddChild(treenode,nodetext); for i:=0 to xmlnode.AttributeNodes.Count -1 do
begin
attrnode := xmlnode.AttributeNodes.Nodes[i];
treeview1.Items.AddChild(newtreenode,'['+attrnode.NodeName +'='+attrnode.text +']');
end; if xmlnode.HasChildNodes then
for I:=0 to xmlnode.ChildNodes.Count -1 do
domtotree(xmlnode.ChildNodes.Nodes[i],newtreenode);
end;end;