|
Add
Loading an XML Document into the DOM
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.
Related Discussions
|
Latest News
Latest Forum Entries
Latest Searches
|