Loading an XML Document into the DOM
(Page 1 of 4 )
In this article we will look at the code that we used to create a program that enabled us to load an XML document into DOM. This article is the fourth part of a four-part series that covers Delphi, XML, and the DOM.
The Code
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
xd: TXMLDocument;
tv: TTreeView;
Button1: TButton;
Button4: TButton;
od: TOpenDialog;
tv1: TTreeView;
procedure Button4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure tv1DblClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure TForm1.Button2Click(Sender: TObject);
private
procedure DOMShow(Anode: IXMLNode; TNode: TTreeNode);
{ Private declarations }
public
fn:string;
{ Public declarations }
end;
const
IMG_NODE_ROOT = 0;
IMG_NODE_CLOSED = 1;
IMG_NODE_OPEN = 2;
IMG_NODE_ROOT2 = 3;
IMG_NODE_CLOSED2 = 4;
IMG_NODE_OPEN2 = 5;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button4Click(Sender: TObject);
begin
close;
end;
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;
procedure TForm1.Button2Click(Sender: TObject);
begin
memo1.Lines.Add(xd.DocumentElement.AttributeNodes.Nodes[0].NodeValue);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ShowMessage(xd.DocumentElement.ChildNodes.Nodes[0].ChildValues['title']);
end;
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;
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;
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.
Next: Code Explained >>
More Delphi-Kylix Articles
More By David Web