![]() |
XML Parser und verschachtelungen.
HI zusammen!
Ich hab ein etwas größeres Problem mmhh wie fang ich den am besten an. Also ich hab einen Parser der auch wunderbar funktioniert. Jetzt habe ich das Problem das ich die Verschachtelungen einer XML Datei irgenwei richtig zugewiesen bekommen muss. Ich habe ein Klasse in der die Informationen gespeicher werden und für jeden XML Eintrag ein neues Objekt erzeugt wird. In der Klasse wird immer der TagName,Content, Id, und eine ParentID gespeichert. Die ParentId soll jetzt immer die ID bekommen den, der Tag untergeordnet ist. Ein kleines Beispiel: XML DATEI:
Code:
In der Klasse sollte es dann so aussehen:
<SG_LEAD>
<Datum>12.12.03</Datum> <Zeit>12:67</Zeit> <Bestellung> <Programm>Windows</Programm> <Anzahl>1</Anzahl> </Bestellung> </SG_Lead>
Code:
So der Parser arbeitet so wenn er einen StartTag findet fürht er die zugehörige Procedure aus, das gleich bei einem EndTag und wenn er einen Wert findet. D.h. bei der obigen XML Datei würden die Proceduren wie folg ausgeführt:
ID | ParentID | Feld | Wert
------------------------------ 1 0 SG_Lead 2 1 Datum 12.12.03 3 1 Zeit 12:67 4 1 Bestllung 5 4 Programm Windows 6 4 Anzahl 1 StartTag StartTag Content EndTag usw....... Hab Ihr vielleicht eine Idee wie ich das lösen könnte oder einen denk anstoss. Ich hänger hier nähmlich echt fest. Vielen Dank schon mal im vorraus mfg Andre |
Re: XML Parser und verschachtelungen.
Hallo Interritor!
Leider hast Du nicht geschrieben, mit welchen Mitteln Du das XML-File parst! Ich gehe deshalb mal von der TXML-Komponente von Delphi aus. Wenn Du die Datei mit der Hilfe dieser Komponente geladen hast, dann hast Du die Datei im Speicher des Rechners eigentlich schon in Baumform liegen. Über diesen Parsebaum kann man relativ einfach mittels einer rekursiven Funktion traversieren und iregendetwas machen. Ich deute den Quellcode hier nur mal kurz an:
Delphi-Quellcode:
Diese Funktion stammt ursprünglich aus einem eigenem Testprogramm und muss im Programm selber mit
procedure TForm1.Traversiere(Wurzel: IXMLNode);
var i : Integer; Knoten : IXMLNode; // aktueller Knoten tvText : String; // Knotenwert oder Text begin for i := 0 to Wurzel.ChildNodes.Count - 1 do // Laufe über alle Knoten der Ebene begin Knoten := Wurzel.ChildNodes.Nodes[i]; if ( Knoten.NodeType = ntText) then tvText := Knoten.NodeValue else begin tvText := Knoten.NodeName; end; Traversiere(Knoten); // Rekursion end; end;
Delphi-Quellcode:
gestartet werden.
Traversiere(xmlDoc.DocumentElement);
Zur Lösung deines Problems würde ich in der rekursiven Funktion noch jeweils die ID des Elternknotens übergeben und vor der Rekursion das entsprechende Object kreieren. MfG -jryan |
Re: XML Parser und verschachtelungen.
Super Danke, werd ich mir mal angucken!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz