So : Jetzt fange ich endlich mal damit an wie man XML in Delphi verwenden kann.
Wie man den Beispielen entnehmen kann stellt ein XML Dokument immer eine baumstruktur da!
Wer bisher noch keine Erfahrung im Bereich OOP gesammelt hat (oder die Objektorientierten Ansätze in Delphi nicht erkannt hat!) sollte sich evtl. mit den Grundlagen in Hinsicht auf die Verwendung von Objekten vertraut machen!
Die in XML verwendete Datenstruktur findet man in sehr vielen verschiedenen Anwendungsbereichen und es lohnt sich sicher diese verstanden zu haben.
XML in Delphi
Zuerst gehen wir mal davon aus wir haben irgendein XML Dokument und wollen die Informationen aus diesem Dokument auslesen und mit diesen Arbeiten:
Das auslesen einer XML Datei wird immer von einem Parser übernommen.
Ganz Harte können sich so einen Parser natürlich auch selbst schreiben, doch im Allgemeinen sollte es ausreichen die vorhandenen Parser zu verwenden!
Der unter Windows am weitesten verbreitet Parser wird mit dem IE ausgeliefert und heisst
MSXML.
Dieser Parser kann einfach über DOM angesprochen werden und steht somit auch unter Delphi zur Verfügung.
Als weitere XML Unterstützung hat Delphi die IXMLDocument Komponente eingeführt.
Ich habe Delphi 6, kann also nicht sagen ab welcher Version diese Komponente enthalten ist oder wie Ihr sie sonst bekommt!
Ich verwende in meinen Beispielen die IXMLDocument Objekte, in der VCL findet Ihr noch die TXMLDocument Komponente, von der Verwendung sollte es keine großen Unterschiede geben, ich verwende die IXMLDocument Klasse da ich meist OOP verwende und hier auf visuelle Komponenten verzichten kann!
Unser erstes Programm :
Das Objekt IXMLDocument ist in der Unit
XMLIntf definiert.
Die Methode newXMLDocument ist in der Unit
XMLDoc definiert.
Der Parser steht in der Regel auf MSXML, kann aber auf jeden beliebigen Parser umgestellt werden.
Um in unserem ersten Beispiel ein XML-Dokument auszulesen definieren wir eine Variable vom Typ
IXMLDocument und weisen dieser im onCreate Ereig. unserer Form mit der Funktion
newXMLDocument ein neues leeres XML Dokument zu.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| Uses XMLDoc, XMLIntf;
var myFirstXML : IXMLDocument;
procedure TForm1.FormCreate(Sender: TObject); begin myFirstXML := newXMLDocument; end; |
Jetzt haben wir zwei Möglichkeiten unserem Dokument eine XML Datei zuzuordnen :
1. Möglichkeit :
Unser Objekt IXMLDocument verfügt über die Funktionen loadFromFile, welche den Inhalt einer XML Datei ausliest.
Wir erzeugen uns also einen Button und ordnen dem onKeyPress Erg. den folgenden Code zu :
(Um die Datei forum.xml zu erhalten kopiert den Text von Beispiel 1 einfach in einen Editor und speichert diese Datei unter forum.xml! Jeder Texteditor ist geeignet!)
Delphi-Quelltext
1:
| myFirstXML.LoadFromFile('forum.xml'); |
2. Möglichkeit :
Unser Objekt IXMLDokument verwaltet den Quelltext der XML Datei in einer Instanz von TStrings. Diese instanz heisst XML und kann über myFirstXML.xml gelesen und beschrieben werden!
Wir setzen eine Memo-Komp und einen zweiten Button auf unsere Form und schreiben in das onClick Erg. des Buttons folgenden Code :
(Die Memo Komp. habe ich xmlSourceMemo genannt!)
Delphi-Quelltext
1:
| myFirstXML.XML := xmlSourceMemo.Lines; |
Nachdem wir unseren Datei-Code in das XML eingelesen oder geschrieben haben müssen wir dem Parser sagen dass er das Dokument auswerten soll!
Hierzu erzeugen wir wieder einen Btn mit dem folgenden Erg.Code :
Delphi-Quelltext
1:
| myFirstXML.Active := true; |
Wenn unser XML Quelltext keine Fehler hat, so hat sich jetzt scheinbar nichts getan!
Hat es aber doch!
Der XML Parser hat das XML Dokument analysiert und eine dem Dokument entsprechende Objektstruktur im Speicher erzeugt. Auf diese Struktur kann jetzt über unser Objekt zugegriffen werden.
Welche Fehler hierbei entstehen können und warum diese auftreten sollte im Forum diskutiert werden, ich werde nicht weider darauf eingehen, da es meistens mit fehlerhaften XML Dokumenten zusammenhängt!
Wenn jetzt keine Fehler aufgetaucht ist dann haben wir unser Objekt erzeugt, ein Dokument zugeordnet und dieses durch den Parser erfolgreich ausgewertet!
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt