Hallo alle zusammen,
ich arbeite in letzter Zeit sehr intensiv mit
XML. Ich verwende dazu OpenXML und die VirtualTreeView in meinen Projekten. Nun kam mir die Idee, ich bau mir ein OpenXMLTree. Ich habe meine Komponente also von TCustomVirtualStringTree abgeleitet und habe die ADOM-Komponenten TDOMImplementation, TXmlToDOMParser und ein TDOMDocument in den Private-Abschnitt eingefügt.
Delphi-Quellcode:
TOpenXMLTree = class(TCustomVirtualStringTree)
private
{ Private declarations }
FXMLDoc : TDomDocument;
FXTDParser : TXmlToDomParser;
FDomImpl : TDomImplementation;
...
Beim Create der Komponente erstelle ich FDomImpl und FXTDParser und setze die Defaultvalues, welche normalerweise über den Objektinspektor gesetzt werden.
Delphi-Quellcode:
constructor TOpenXMLTree.Create(AOwner: TComponent);
begin
inherited Create (AOwner);
SetupXMLTree;
if not (assigned (FDomImpl)) then
FDomImpl := TDomImplementation.Create(AOwner);
if not (assigned (FXTDParser)) then begin
FXTDParser := TXmlToDomParser.Create(Parent);
FXTDParser.DOMImpl := FDomImpl;
FXTDParser.BufferSize := 4096;
FXTDParser.KeepCDATASections := True;
FXTDParser.KeepComments := True;
FXTDParser.KeepEntityRefs := True;
FXTDParser.ErrorReportingEnabled := True;
end;
end;
Beim Aufruf der LoadXML Routine wird zuerst geparst (Result ist ein TDomDocument) und anschließend sollte die Struktur aufgebaut in die Nodes in der VirtualTreeView angezeigt werden.
Delphi-Quellcode:
procedure TOpenXMLTree.LoadXML(Filename: String);
begin
FXMLDoc := FXTDParser.ParseFile (Filename, True);
LoadDocumentStructure;
end;
Mein Problem ist, dass dies leider so nicht funktioniert. Wenn ich den Code debugge, sehe ich, dass das
XML-Dokument angeblich keine ChildNodes hat (assigned ja, aber Length = 0).
Klatsche ich die DomImplementation und den Parser auf ein Form und übergeben statt dem Filename in der LoadXML-Routine das bereits fertig geparste
XML-Dokument, sind plötzlich ChildNodes vorhanden.
Wäre toll wenn mir jedmand auf die Sprünge helfen kann und mir sagt warum das nicht klappt. Grundsätzlich wäre zu sagen, dass ist meine erste Eigenbaukomponente. Sollte ich also irgendwelche grundlegenden Sachen vergessen haben, bitte mich darauf hinzuweisen.
Danke
Alex
PS: Ich weiß, es gibt bereit eine XMLTree-Komponente, diese basiert aber auf der MSXML_TLB.