Abschließend wird die Haskell XML Toolbox mit den anderen Ansätzen zum Parsen von XML-Dokument verglichen. Zum einen werden die Ansätze von HaXML und HXML, die bereits an mehreren Stellen erwähnt aufgezeigt, zum anderen wird der DOM/JDOM Ansatz erklärt und mit der Haskell XML Toolbox verglichen. Natürlich werden nicht die kompletten Systeme vorgestellt sondern nur die Ideen der verschiedenen Parser.
Wie bereits in Kapitel 3 erwähnt, ist die Repräsentation der Daten eines XML-Dokumentes der Haskell XML Toolbox an der von HXML angelehnt. In HXML wird das XML-Dokument als Tree von XMLNodes gespeichert. Tree ist ein generischer Baum, bei dem nicht zwischen Blättern und Knoten unterschieden wird. Blätter sind Knoten mit einer leeren Liste von Kindelementen.
Datenstruktur von HXML:data Tree a = Tree a [Tree a] type XML = Tree XMLNode data XMLNode = RTNode -- root node | ELNode GI AttList -- element node: GI, attributes | TXNode String -- text node | PINode Name String -- processing instruction (target,value) | CXNode String -- comment node | ENNode Name -- general entity reference deriving Show
Im Gegensatz zur Haskell XML Toolbox, wo sowohl DTDs als auch XML-Dokumente mit dem gleichen generischen Datentyp NTree definiert werden, benutzt HXML für die Darstellung von DTDs eine extra Definition. Die DTDs werden in Feldern gespeichert und nicht in dem generischen Baum.
DTD Datentyp in HXML:data DTD = DTD { elements :: FM.FM Name ELEMTYPE, -- elemtps / element types attlists :: FM.FM Name [ATTDEF], -- elemtype.attdefs genents :: FM.FM Name EntityText, -- general entities parments :: FM.FM Name EntityText, -- parameter entities notations:: [DCN], -- nots/notations dtdname :: Name -- name (document type name) } deriving Show
Damit kann in HXML DTDs und XML-Dokumente nicht mit den gleichen auf den generischen Baum definierten Funktionen verarbeitet werden. Aber gerade das ist der große Vorteil des generischen Ansatzes, den die Haskell XML Toolbox viel konsequenter einsetzt.
Der Ansatz von HaXML ist ein völlig anderer. Hier wird für jedes XML Element ein eigener allgebraischer Datentyp definiert. Blätter und innere Knoten werden klar unterschieden. Auf die genaue Darstellung soll hier nicht eingegangen werden. Zur Verarbeitung der Daten hat HaXML das Filterkonzept implementiert, was die Haskell XML Toolbox übernommen hat. Allerdings kann es in HaXML nicht voll eingesetzt werden, da hier die Repräsentation der Daten nicht auf einem generischen Baum basiert. So kann in HaXML die Definition der Filter nicht so allgemein gehalten werden, wie das ist der Haskell XML Toolbox der Fall ist.
Die Haskell XML Toolbox hat also die verschiedenen Vorteile von HaXML und HXML vereint und ist damit ein sehr flexiblen und leicht erweiterbarer XML-Parser.
Die Grundlage von DOM (Document Object Model) ist, das XML-Dokument in einer Baumstruktur komplett in den Speicher zu laden. Die Verarbeitung der Daten erfolgt dann immer auf dem ganzen Baum. Der DOM-Ansatz zur Speicherung ist also dem Ansatz der Haskell XML Toolbox nicht unähnlich. Allerdings ist die Verarbeitung in DOM und vor allem in der Implementierung in JDOM vollkommen anders als die in der Haskell XML Toolbox. Das liegt natürlich zum einen daran, das JDOM ein in Java geschriebener Parser ist und sich damit die Implementierungen sehr stark unterscheiden.
In JDOM gibt es zwei wichtige Klassen, Document und Element. Document repräsentiert ein XML-Dokument und Element definiert die Knoten des Dokumentenbaumes, die beliebig geschachtelt werden können. Für die Verarbeitung von XML-Daten bieten die Klassen Document und Element verschiedene Zugriffsmethoden, um Knoten zu selektieren, zu bearbeiten und zu löschen. Im Gegensatz zu der eingebetteten DSL in der Haskell XML Toolbox ist der Aufwand mit JDOM viel größer, den Dokumentenbaum zu verarbeiten. In der Haskell XML Toolbox lassen sich, wie in dem vorgestellten Beispiel (s. Abschnitt 4.5) gezeigt, mit wenigen Zeilen Programmcode komplexe Verarbeitungen schreiben. In JDOM dagegen ist viel mehr Javacode nötig um die gleichen Ergebnisse zu erzielen. Vor allem das Traversieren durch den Xml-Baum in JDOM erfordert viel mehr Aufwand als in der Haskell XML Toolbox.