Home » Tutorials » Datenspeicherung » ThaXML-Library

ThaXML-Library

Speichern

Schauen wir uns erst einmal an, wie sich das Objekt TTest speichert. Der Prozedur „SaveToXML“ wird ja der Parameter „AParent“ übergeben. Dieser hat den Typ „TXMLTag“. Dieser Typ stammt aus dem ThaXML Library und repäsentiert einen XML-Tag. Am Ende dieses Tutorials werde ich alle Eigenschaften und Methoden dieses Typs erläutern. Wichtig ist nur, dass ein TXMLTag andere TXMLTags als „Kindelemente“ speichern kann. Das TTest-Objekt soll sich also „als Kind“ des Tag „AParent“ speichern.
Mit dem ThaXML Library ist das gar kein Problem. Zuerst sichern wir den Integerwert, danach den Inhalt der zwei Stringlisten. Jede Liste bekommt einen eigenen Tag spendiert, so dass die Listen auch in der Datei auseinander gehalten werden können.

procedure TTest.SaveToXML(AParent: TXMLTag);
var i: integer;
  p: TXMLTag;
begin
  TXMLTag.Create(AParent, 'int', IntToStr(int));

  // einen neuen Tag für str1 anlegen
  p := TXMLTag.Create(AParent, 'liste1'); // str1 sichern
  for i := 0 to str1.Count-1 do
    TXMLTag.Create(p, 'eintrag', str1[i]);

  // einen neuen Tag für str2 anlegen
  p := TXMLTag.Create(AParent, 'liste2'); // str2 sichern
  for i := 0 to str1.Count-1 do
    TXMLTag.Create(p, 'eintrag', str1[i]);
end;

In der ersten Zeile wird ein neuer TXMLTag erzeugt. Da wir dem Constructor mitteilen, dass der neue Tag „AParent“ als Besitzer haben soll, müssen wir die zurückgegeben Objektrefernz nicht speichern. TXMLTag fügt sich automatisch in den Parent-Tag ein. Somit entfällt hier die Zuweisung an „p“. Der zweite Parameter gibt den Namen bzw. die Überschrift des Tags an. Mit dem dritten Parameter kann ein Text angegeben werden, der zwischen dem Tagpaar steht. In der Datei sieht diese Zeile so aus (wenn „int“ den Wert 999 hat):

<int>999</int>

Für die Stringlisten erstellen wir einen eigenen Tag. Da der Inhalt der Listen „unterhalb“ dieses Tags gespeichert werden soll, müssen wir diesmal die Refernz auf den Tag in „p“ speichern, die Tags für die Strings selbst können wieder ohne Refernz eingefügt werden. Sie sehen außerdem, alle Zeilen der Stringliste heißen „Eintrag“. Im Prinzip spielt der Name hier keine Rolle, da nur der Wert zwischen den Tags den Inhalt wiedergibt.
Der Ausschnitt aus der Datei sieht dann so aus:

<int>999</int>
<liste1>
 <eintrag>nullte Zeile der ersten Liste</eintrag>
 <eintrag>erste Zeile der ersten Liste</eintrag>
</liste1>
<liste2>
 <eintrag>nullte Zeile der zweiten Liste</eintrag>
 <eintrag>erste Zeile der zweiten Liste</eintrag>
</liste2>

So speichert sich also das Objekt TTest. Nun speichern wir das TEinstellungen-Objekt. Mit dieser guten Vorbereitung ist das kein Problem mehr.

procedure TEinstellungen.SaveToXML(AParent: TXMLTag);
var i: integer;
  t: TTest;
  l, p: TXMLTag;
begin
  // checked sichern, je nach Wert
  if checked then TXMLTag.Create(AParent, 'checked', 'true')
  else TXMLTag.Create(AParent, 'checked', 'false');

  // Zeichenkette sichern
  TXMLTag.Create(AParent, 'zeichenkette', zeichenkette);

  // neuen Tag für die Liste
  l := TXMLTag.Create(AParent, 'list');

  // Liste der TTestobjekte sichern
  for i := 0 to List.Count-1 do begin
    // TTestobjekt holen
    t := TTest(List[i]);
    // neuen Tag für das Objekt erzeugen
    p := TXMLTag.create(l, 'object');
    // TTest in p sichern
    t.SaveToXML(p);
  end;
end;

Zuerst wird die Variable „Checked“ gesichert, je nachdem ob der Wert „true“ oder „false“ ist. Auch die Zeichenkette wird einfach gespeichert. Die Testobjekte sind in einer Liste gespeichert. Nun machen wir Folgendes: Die Liste bekommt einen eigenen Tag. Für jeden Eintrag der Liste holen wir uns erst mal mittels Typcasting einen Zeiger auf das TTest-Objekt. Dann erstellen wir einen neuen Tag für das Objekt und speichern diesen anschließend darin.

Achtung: Die erzeugten TXMLTag-Objekte nicht wieder freigeben, da diese jetzt dem Objekt „AParent“ gehören!
Eine Frage steht noch offen: Auch die Prozedur „SaveToXML“ von TEinstellungen erfordert einen „AParent“-Parameter. Wo kommt dieser her? Und wann wird die Datei wirklich gespeichert? Öffnen Sie das Hauptformular der Anwendung in Delphi. Markieren Sie die Komponente XMLParser. Die Eigenschaft Codec verweist auf die Komponente XMLCodec. Dieser Codec sorgt dafür, dass in XML nicht erlaubte Sonderzeichen richtig kodiert werden. Gehen Sie nun im Quelltext zur Prozedur „btSaveClick“.

procedure TForm1.btSaveClick(Sender: TObject);
var xml: TXMLTag;
begin
  xml := TXMLTag.Create(nil, 'xml');
  einst.SaveToXML(xml);
  XMLParser.SaveToXML(xml, 'config.xml');
  xml.Free;
end;

Hier erstellen wir das oberste XML-Tag-Objekt und geben ihm den Namen „xml“. Die Variable „einst“ ist vom Typ TEinstellungen. Dessen Prozedur „SaveToXML“ bekommt die Referenz auf „xml“ übergeben. Nun haben wir alle Einstellungen im Tag „xml“ gesichert. Unser Parser schreibt das Ganze noch auf die Festplatte, ebenfalls mit „SaveToXML“. Der erste Parameter gibt das sog. „root“-Objekt an, den XML-Wurzelknoten. Der zweite ist der Dateiname. Im Anhang werden die weiteren möglichen Parameter erläutert.
Jetzt geben wir den ganzen Speicher wieder frei, den wir mit den XML-Objekten belegt haben (letzte Zeile).
Insgesamt haben wir jetzt 20 Codezeilen gebraucht, um die Einstellungen in einem richtigen XML Dokument zu speichern. Die „config.xml“ könnte nun ungefähr so aussehen:

<?xml version="1.0" standalone="yes"?>
<xml>
 <checked>false</checked>
 <zeichenkette>
 Das ist "Mit dem ThaXML Library Programmeinstellungen
 speichern - aber richtig!" Tutorial
 </zeichenkette>
 <list>
 <object>
 <int>999</int>
 <liste1>
 <eintrag>nullte Zeile der ersten Liste</eintrag>
 <eintrag>erste Zeile der ersten Liste</eintrag>
 </liste1>
 <liste2>
 <eintrag>nullte Zeile der zweiten Liste</eintrag>
 <eintrag>erste Zeile der zweiten Liste</eintrag>
 </liste2>
 </object>
 </list>
</xml>

Im Tag „Zeichekette“ erkennt man auch die kodierten Sonderzeichen (Anführungsstriche “ und Ausrufezeichen !).