Wenn man alle Textelemente auf einer neuen Zeile ausgibt, kommt folgende Darstellung raus (Man beachte die enthaltenen Leerzeichen am Anfang gewisser Textelemente) :
Allerdings möchte ich eben folgendes erhalten:
So sieht ein korrektes Feature (= Methode) in der Programmiersprache Eiffel aus. Mein Problem ist nun, wie ich vom DOM Tree eine solche Darstellung bekomme. Für den DOM Tree habe ich einen Parser. im DOM Tree sind alle Elemente des XML Files als Knoten vorhanden. Attribute und Textelemente gehören zu den jeweiligen Knoten (werden in Listen gehalten). Ich habe da v.a. folgende Probleme:
- Wie erkenne ich wann eine neue Zeile anfängt und wie kriege ich die Einrückungen korrekt hin. Deine Ausgabe oben ist ja von der Reihenfolge gleich wie meine Ausgabe, allerdings mit anderen Einrückungen und Zeilenumbrüchen.
- prune() ist das Textelement eines Knoten, wobei "prune(" das erste Textelement in der Liste ist und ")" das zweite. Würde ich nun einfach das Textelement des Knotens ausgeben hätte ich prune() etc. anstatt prune(n,l) etc.
Ich hoffe, dass du mir da vielleicht weiterhelfen kannst.
Der Hintergrund ist folgender: Ich habe erfolgreich einen Diff Algorithmus geschrieben, der auf den DOM Tree angewendet werden kann. Der Dom Tree soll nun in einem GUI als Code (wie oben) ausgegeben werden und die jeweiligen Differenzen markiert werden.
Das ergibt gleich noch eine kleine Frage: Ausgegeben werden ja nur Textelemente, allerdings hat es ja auch viele Elementknoten ohne Textelemente (z.B. <ast:feature_name>). Nun ist es ja z.B. möglich, dass nach Anwedung des diff Algorithmus ein Textelement z.B. als 'changed' markiert wird, das parent Element (welches keinen Text enthält) aber als 'added'. Soll dann nun der ausgegebene Text als 'changed' oder als 'added' markiert werden? Bzw. muss man da nur auf edit operationen bei Elementen mit Text schauen?
Ich möchte ja zudem noch unwichtige Knoten aus dem DOM Tree löschen (damit der diff alg schneller läuft). Da kann ich eigentlich alle internen Knoten löschen, welche kein Text enthalten und nur ein Kind haben, oder?
Wieso das? "(", dann kommt die list_of_expr, worin sich n und 1 befinden - also n,1 - dann erst kommt der String ")". Also ( n,1 ). Richtige Reihenfolge.
"prune()" ist ein einziger Text bzw. gehört zu einem einzigen Knoten, wobei "prune(" das erste Elemente und ")" das zweite Element in der Textliste des Knoten ist, allerdings ist es derselbe Knoten.
Einrückungen wirst Du Dir selbst bauen müssen, wozu sollte man die in den AST packen, der AST verkörpert seine (korrekte) Einrückung. Wie das ursprünglich aussah... wen interessiert das?
Die Textelemente enthalten bereits implizit Einrückungen, also z.B.
.....
<ast:body_as>
(
.....
Da ist das Textelement " (". Allerdings sind diese Einrückungen wohl nicht ganz korrekt, wenn man den Text einfach ausgibt.
Wenn Du einen DOM hast, dürftest Du das so einlesen können und als Quelltext wegschreiben können.
Da gibt es wieder die Probleme wie oben beschrieben. Ich habe erfolgreich das XML File in einen DOM Tree geparsed und kann den auch traversieren, wenn ich aber den Baum traversiere und einfach die Textelemente "wegschreibe" dann sieht der Code nicht gerade super aus.