I create an instance of TXMLDocument at run time to load and parse the XML file. You can check the code below:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls; type Txml = class(TForm) // XMLDocument1: TXMLDocument; Memo1: TMemo; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var xml: Txml; implementation {$R *.dfm} procedure Txml.FormCreate(Sender: TObject); var i,j:integer; aNode:IXMLNode; ws:String; XMLDocument1:TXMLDocument; begin Memo1.Lines.Clear; XMLDocument1 := TXMLDocument.Create(nil); try XMLDocument1.LoadFromFile('C:\a.xml'); XMLDocument1.Active := true; aNode := XMLDocument1.ChildNodes.First; while aNode<>nil do begin for i := 0 to aNode.ChildNodes.Count-1 do begin if aNode.ChildNodes[i].NodeName = 'Role' then begin Memo1.Lines.Add('Tag - '+aNode.ChildNodes[i].ChildNodes['Tag'].Text); for j := 0 to aNode.ChildNodes[i].ChildNodes.Count-1 do if aNode.ChildNodes[i].ChildNodes[j].HasChildNodes then begin ws := VarToStr(aNode.ChildNodes[i].ChildNodes[j].ChildValues['Tag']); if trim(ws)<>'' then Memo1.Lines.Add(ws); ws := VarToStr(aNode.ChildNodes[i].ChildNodes[j].ChildValues['Value']); if trim(ws)<>'' then Memo1.Lines.Add(ws); end; end; end; aNode := aNode.NextSibling; end; XMLDocument1.Active := false; finally FreeAndNil(XMLDocument1); end; end; end.
The problem is that it generates AV. As you probably saw before the component was in the form (// XMLDocument1: TXMLDocument;).
Why, when the component was in the form, the code worked, but when I create it at runtime, it generates AV?
LE: solution : based on answers / comments and Delphi help:
XMLDocument1 : IXMLDocument; //not TXMLDocument XMLDocument1 := LoadXMLDocument(...); FreeAndNil;// must be deleted
source share