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.