Baumauswertung |
Top Previous Next |
Beispiele > XML > Baumauswertung
Wenn man die Struktur eines Dokuments zunächst in einen Baum umwandelt, statt sie unmittelbar in die gewünschte Form zu transformieren, so hat das den Vorteil, dass ein Zugriff auf die Daten nun mehrfach und in beliebiger Reihenfolge möglich ist. Die Ausgabe der Daten kann nun sehr systematisch organisiert werden und das Schreiben verschiedener Formate, z.B. Html und Rtf, kann durch einander ähnliche Prozeduren erfolgen.
In diesem Übungsbeispiel soll das XML-Dokument schlicht als einfacher Text ausgegeben werden.
Die Prozeduren zur Textausgabe der Baumdaten sind in einem gemeinsamen Container versammelt:
mstrfun m_PrintText;
Bei dem Typ mstrfun handelt es sich um eine Funktionstabelle: mstrfun enthält Klassenfunktionen, die auf Knoten angewendet werden sollen, deren Label gleich dem Schlüssel ist, unter dem die Funktion in der Tabelle gespeichert ist.
Die Tabelle wird folgendermaßen initialisiert:
{{ m_PrintText.add("", DontPrint); m_PrintText.add("document", DocText); m_PrintText.add("element", ElementText); m_PrintText.add("content", ContentText); m_PrintText.add("Attributes", AttributesText); }}
D.h. für einen Knoten mit dem Label "document" soll die Funktion mit dem Namen "DocText" ausgeführt werden; für einen Knoten mit dem Label "element" soll die Funktion mit dem Namen "ElementText" ausgeführt werden ... In der ersten Initialisierungsanweisung ist eine Default-Funktion angegeben, die für alle Knoten ausgeführt werden soll, deren Label mit keinem der übrigen Schlüssel der Tabelle übereinstimmt.
Die Funktionen DocText, ElementText, CharDataText und DontPrint sind alle auf der Seite für Klassenelemente definiert. Die Funktion DocText ist für die Wurzel des Baumes aufzurufen:
{{ node pos = xNode.firstChild(); while(pos != node::npos) { m_PrintText.visit(pos); pos = pos.nextSibling(); } }}
Hier wird für alle Kind-Knoten des Knotens m_PrintText.visit(xState, pos) aufgerufen. Die visit-Methode einer Funktionstabelle ist der Angelpunkt der gesamten Baumauswertung. Die Methode leitet das Knotenargument pos weiter an diejenige Funktion, die zum Label des Knotens passt. Man kann die visit-Funktion in diesem Beispiel als eine Abkürzung lesen für:
if(xNode.label() == "document") { DocText(xNode); } else if(xNode.label() == "element") { ElementText(xNode); } else if(xNode.label() == "CharData") { CharDataText(xNode); } else { DontPrint(xNode); }
Die Funktion ElementText ist ebenso aufgebaut wie DocText, nur dass der Wert des Elements ausgegeben wird, bevor die Unterknoten besucht werden.
out << indent << xNode.value() << endl;
Auf diese Weise werden beginnend beim Wurzelknoten alle Unterknoten systematisch durchlaufen, bis schließlich die Blattknoten erreicht sind. Dort gibt die Funktion CharDataText ihren Wert aus.
|
Diese Seite gehört zur TextTransformer Dokumentation |
Home Inhalt English |