DUXMLParser

DUXMLParser ist ein einfacher XML-Parser, der nicht die MSXML/OpenXML-Schnittstelle benutzt, sondern eine eigene Implementierung mitbringt.

Download hier: DUXMLParser.pas

Geschrieben habe ich ihn, weil mir die Verwendung von OpenXML/MSXML einfach zu kompliziert war und ich einen Pascal-nativen, einfachen XML-Parser brauchte. Inzwischnen kann man sogar Dateien damit bearbeiten und erstellen.

Unterstützung für Sachen wie PCDATA-Pseudoknoten gibt es nicht, außerdem findet kein Encoding der Zeichen statt. Sollen Umlaute also nicht direkt in der Datei erscheinen, muss dies von Hand geändert werden. Dies ist allerdings das Einzige, in dem sich der Parser nicht an den Stadard hält. Alles andere ist voll Standardkonform:

  • Leere Knoten werden verkürzt
  • Leere Attribute fallen weg, da Attribute immer einen Wert haben müssen
  • <?xml … ?> – Knoten werden korrekt gelesen
  • <!DOCTYPE > und ähnliche Angaben mit ! werden korrekt verarbeitet

2006-09-09: Ich habe die neue Version mit neuem Parser hochgeladen. Er sollte jetzt mit standardkonformen XML-Dateien klarkommen. Auch (X)HTML funktioniert. Die Unterstützung ist noch etwas unkomfortabel, aber ich arbeite dran. Momentan muss für jeden Kommentar einzeln das Speichern aktiviert werden. Wer also solche Dateien hat, dran denken!

2007-04-03: Wieder eine neue Version. Diesmal ist alles enthalten, der Parser besteht meinen XML-Killer-Test. Der bestand darin, diese Datei lesen zu können, und beim Speichern genau die selbe zu erzeugen.

Außerdem gibt es eine neue Funktion WalkTree die den Baum rekursiv durchgeht und für jeden Knoten eine Callback-Prozedur aufruft. Grade bei XML braucht man sowas ja doch öfter.

Programmierung mit DUXMLParser

Lesen einer bestehenden XML-Datei

procedure TForm1.FormCreate(Sender: TObject);
var x:TXMLFile
begin
  x:= TXMLFile.Create;
  try
    x.LoadFromFile('myfile.xml');
    showmessage(x['node/subnode/value'].TextData);
  finally
    x.Free;
  end;
end;

Man sieht auch, dass man über Pfadangaben direkt bestimmte Unterknoten erreichen kann. Das Funktioniert auch mit den Funktionen GetNode, GetAttribute, SetAttribute, GetText, SetText, GetAttribute, SetAttribute, GetText.

Erstellen einer XML nach Standard

Bis hierhin haben wir also den Kopf ()

Daten einfügen

FDoc.AddItem('root');
with FDoc.GetNode('root') do begin
  with AddItem('part1') do
    AddItem('title').TextData := '';
end;

Ändern von Werten

with FDoc.GetNode('story/part1') do begin
  GetNode('title').TextData := 'Test-Node';
  GetNode('title').Attributes['hint'] := 'Some useless hint.';
end;

Alternative Aufrufe

FDoc.SetText('story/part1/title','Test-Node');
FDoc.SetAttribute('story/part1/title','hint','Some useless hint.');

Der Doctype-Knoten

with FDoc.AddItem('') do begin
  Kind:= epSpecial;
  TextData:= 'DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd"';
end;

Es wird also der Inhalt des Knotens als TextData abgebildet.