Delphi Wrapper Classes and XML - Second Part of Code
(Page 4 of 4 )
The second part of the code lists a function that will facilitate the manipulation of the elements listed on the DOM tree:
procedure TForm1.DOMShow(Anode: IXMLNode; TNode: TTreeNode);
var
I: Integer;
NTNode: TTreeNode;
NText: string;
AttrNode: IXMLNode;
begin
// skip text nodes and other special cases
if not (Anode.NodeType = ntElement) then
Exit;
// add the node itself
NText := Anode.NodeName;
if Anode.IsTextElement then
NText := NText + ' = ' + Anode.NodeValue;
NTNode := tv.Items.AddChild(TNode, NText);
// add attributes
for I := 0 to Anode.AttributeNodes.Count - 1 do
begin
AttrNode := Anode.AttributeNodes.Nodes[I];
tv.Items.AddChild(NTNode,
'[' + AttrNode.NodeName + ' = "' + AttrNode.Text + '"]');
end;
// add each child node
if Anode.HasChildNodes then
for I := 0 to Anode.ChildNodes.Count - 1 do
DOMShow(Anode.ChildNodes.Nodes [I], NTNode);
end;
The procedure below reads the names of some XML files and loads them into a treeview control:
procedure TForm1.FormCreate(Sender: TObject);
var
rec:TSearchRec;
begin
// Try to find regular files matching *.xml in the current dir
if FindFirst('MyXMLFiles*.xml', faAnyFile, rec) = 0 then
begin
with tv1.Items.AddFirst(nil, 'MyXMLFiles') do
begin
Selected:=true;
{Set the roots image index}
ImageIndex := IMG_NODE_ROOT;
{Set the roots selected index. The same image is uses
as for the ImageIndex}
SelectedIndex := IMG_NODE_ROOT;
end;
repeat
with tv1.Items.AddChildFirst( tv1.Selected, rec.Name) do
begin
{Set the image used when the node is not selected}
ImageIndex := IMG_NODE_CLOSED;
{Image used when the node is selected}
SelectedIndex := IMG_NODE_OPEN;
MakeVisible;
end;
until FindNext(rec) <> 0;
// Must free up resources used by these successful finds
FindClose(rec);
end
else begin
with tv1.Items.AddFirst( nil, 'No Files Found' ) do
begin
Selected := true;
end;
end;
end;
The procedure below is responsible for loading an XML file into the DOM tree:
procedure TForm1.tv1DblClick(Sender: TObject);
var
path,xmlfile:string;
begin {
path:=extractfilepath(application.ExeName);
if (tv1.Selected.Level <> 0) then begin
fn:=tv1.Selected.Text;
//showmessage(path+fn);
xmlfile:=path+fn;
od.FileName:=xmlfile;
xd.LoadFromFile(od.FileName);
// tv.Items.Clear;
DOMShow(xd.DocumentElement, nil);
tv.FullExpand;
end; }
end;
The procedure below is an extra that makes it easier for the user to select XML files from any directory or location on the computer:
procedure TForm1.Button1Click(Sender: TObject);
begin
od.InitialDir := ExtractFilePath (Application.ExeName);
if od.Execute then
begin
xd.LoadFromFile(od.FileName);
tv.Items.Clear;
DOMShow (xd.DocumentElement, nil);
tv.FullExpand;
end;
end;
end.
And here's the program that the code produces:

In the next article we will work through the code and also make further additions to the program.
| DISCLAIMER: The content provided in this article is not warranted or guaranteed by Developer Shed, Inc. The content provided is intended for entertainment and/or educational purposes in order to introduce to the reader key ideas, concepts, and/or product reviews. As such it is incumbent upon the reader to employ real-world tactics for security and implementation of best practices. We are not liable for any negative consequences that may result from implementing any information covered in our articles or tutorials. If this is a hardware review, it is not recommended to open and/or modify your hardware. |