XML Tag einfuegen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
dreba_user
User
Beiträge: 6
Registriert: Dienstag 6. März 2007, 18:20

Hallo,
als Jython-Newbee versuche ich ein Logging im XML Format. Ich habe folgendes Problem:
Ich moechte in ein bestehendes XML-File weitere Eintraege einfuegen.
Beispiel Logdatei:
<mylog>
<logEntry>blabla</logEntry>
</mylog>

Hier moechte ich also einen weiteren Eintrag <logEntry>blub</logEntry> einfuegen.
Im Moment lese ich die Datei bis </mylog> und kopiere diese in eine neue temporaere Datei, haenge den neuen Eintrag und </mylog> an. Danach lösche ich das Original und kopiere die temporaere Datei.

Irgendwie nicht ganz elegant, oder ? Kann mir jemand ein Beispiel fuer eine bessere Loesung geben ? Vielen Dank schon mal.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Im Grunde genommen hört sich das doch garnicht so dumm an. IMHO macht es Sinn erst eine Temp-Datei zu erzeugen und nach dem *erfolgreichen* erstellen, die alte Datei zu löschen.
Denn was passiert, wenn es nicht erfolgreich ist?

XML Daten kannst du mit Elementree (neu ab Python 2.5 dabei) verwalten. Einzelheiten kenne ich dabei aber nicht...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

dreba_user hat geschrieben:Logging im XML Format.
Hallo dreba_user!

Willkommen im Python-Forum!

Vorab: XML ist so ziemlich ungeeignet fürs Logging, da man nicht einfach etwas hinten dran schreiben kann, sondern jedes mal den neuen XML-TAG mitten in die XML-Datei reinquetschen muss. So etwas lässt sich nicht einfach so programmieren, dass es für den Computer ressourcenschonend läuft. Das "reinquetschen" ist immer mehr Aufwand, als das Anhängen von Daten.

Besser wäre es, wenn du fürs Logging ein Format nehmen würdest, wo jeder Logeintrag an einen Text ganz unten angefügt wird. Dafür muss nicht jedes mal die ganze Textdatei neu eingelesen werden.

Hier habe ich mich mit XML und Elementtree gespielt:
http://www.python-forum.de/post-54643.html#54643

Allerdings nicht so, dass du damit ein schonendes Logging aufbauen könntest, aber vielleicht kannst du damit etwas anfangen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
dreba_user
User
Beiträge: 6
Registriert: Dienstag 6. März 2007, 18:20

Hallo Jens, hallo Gerold,
erstmal vielen Dank fuer die schnellen Antworten.

@Jens
Ich habe mir os.rename() probiert die temporaere Datei umzubenennen. Leider hat das nicht geklappt, da der Ziel-Dateiname ja bereits existiert. Gibt es diese Funktion auch irgendwo mit einem "-force" Parameter, der es ermoeglicht das Umbennennen tatsaechlich durchzufuehren auch wenn das Ziel bereits vorhanden ist ?

Bei der Version bin ich auf 2.1.3 festgelegt, da ich Jyton fuer Skripte des IBM WebSphere Applicationserver benutzte und hier halt diese Version enthalten ist.

@Gerold
Stimmt schon, XML ist da nicht die erste Wahl. Aber ich moechte den Benutzern die Loginformationen mit XSL transformiert im Browser zur Verfuegung stellen. Vieleicht muss ich auch nochmal bei XML forschen, ob die Logeintraege "<logEntry>blabla</logEntry> " sequentiell in eine Datei schreiben kann und diese Datei als Bestandteil einer anderen XML-Datei einfuegen kann und trotzdem die XSL Formatierung greift.

Dein Beispiel schaue ich mir auf jeden Fall noch etwas genauer an, wobei ich bei den zur Verfuegung stehenenden Libs die Klasse ElementTree nicht gefunden habe.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

dreba_user hat geschrieben:wobei ich bei den zur Verfuegung stehenenden Libs die Klasse ElementTree nicht gefunden habe.
Hallo dreba_user!

Dann war "Jython" also kein Verschreiber. :roll:

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

dreba_user hat geschrieben:Ich habe mir os.rename() probiert die temporaere Datei umzubenennen. Leider hat das nicht geklappt, da der Ziel-Dateiname ja bereits existiert.
Du must schon vorher die andere Datei löschen oder auch umbenennen, zb. nach *.old oder so.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
dreba_user
User
Beiträge: 6
Registriert: Dienstag 6. März 2007, 18:20

Hallo Gerold,

Jython war kein Vertipper, ist aber eigentlich das Gleiche. Wenn ich's richtig verstanden habe ist hier der Interpreter halt in Java und nicht in C.

Viele Gruesse
dreba_user
User
Beiträge: 6
Registriert: Dienstag 6. März 2007, 18:20

jens hat geschrieben:Du must schon vorher die andere Datei löschen oder auch umbenennen, zb. nach *.old oder so.
Yepp, so mach ich's z.Z.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Richtig, und Jython ist meines Wissens nur auf dem Stand von CPython 2.2 oder soll da zumindest demnächst angelangt sein. ElementTree ist eine Pure-Python-Implementierung, du kannst es also einfach in deinen Pfad kopieren und importieren. Wesentlich schneller ist cElementTree, dass Teile in C implementiert. Das dürfte bei Jython aber ein Problemchen werden ;)

Wenn es dir nur darum geht, "hinterher" die Logs aufzubereiten, würde ich dir empfehlen, das logging-Paket zu verwenden. Das wird zwar erst mit Python 2.3 geliefert, kann aber auch separat für ältere Versionen bezogen und verwendet werden. Anschließend kannst du im Zuge der XSLT-Umwandlung zunächst das Logfile in ein XML-Format bringen. Denn wie gerold schon geschrieben hat, ist Schreiben in XML relativ zum "herkömmlichen" Plaintext-Logging (das zudem solche XML-Probleme wie erforderliche Wohlgeformtheit gar nicht kennt) wie XML eher langsam, durch die fehlende Aufrüstbarkeit auf cElementTree noch einmal. Direkt mit SAX oder DOM ist es vermutlich auch nicht viel schneller, angenehmer zu programmieren wohl erst recht nicht.

Wie war das? "If XML is your hammer, everything looks like a nail." Und im Bereich Java erst recht.
dreba_user
User
Beiträge: 6
Registriert: Dienstag 6. März 2007, 18:20

Y0Gi hat geschrieben:ElementTree ist eine Pure-Python-Implementierung, du kannst es also einfach in deinen Pfad kopieren und importieren.
Na dann lad ich nochmal Python runter.
Y0Gi hat geschrieben:Wenn es dir nur darum geht, "hinterher" die Logs aufzubereiten,
Tja, da hatte ich mich vieleicht mißverständlich ausgedrückt. Da ich den Nutzerkreis kenne und die alle den selben Browser nehmen, übernimmt der Browser die XML Transformierung. SAX und DOM erscheint mir auch zu aufwändig. Ich schau mir zwar noch mal den ElementTree an, glaube aber, dass ich bei der derzeitigen Lösung bleibe. Funktioniert ja.
Y0Gi hat geschrieben:Wie war das?
Ganz lieb :D
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

dreba_user hat geschrieben:
Y0Gi hat geschrieben:ElementTree ist eine Pure-Python-Implementierung, du kannst es also einfach in deinen Pfad kopieren und importieren.
Na dann lad ich nochmal Python runter.
Nicht, dass du mich missverstehst: Ich meine damit, das ElementTree-Paket ist in reinem Python geschrieben und daher portabel - sollte also auch in Jython nutzbar sein.

dreba_user hat geschrieben:Tja, da hatte ich mich vieleicht mißverständlich ausgedrückt. Da ich den Nutzerkreis kenne und die alle den selben Browser nehmen, übernimmt der Browser die XML Transformierung.
Öffnen die Betrachter die Logdatei denn lokal oder beziehen sie diese über den Webserver? In letzterem Fall lässt sich das ja wrappen, d.h. ein Parser liest die (Text-)Logdatei und bastelt da XML draus, das dann an den Browser ausgeliefert wird.
dreba_user
User
Beiträge: 6
Registriert: Dienstag 6. März 2007, 18:20

Y0Gi hat geschrieben:Nicht, dass du mich missverstehst: Ich meine damit, das ElementTree-Paket ist in reinem Python geschrieben und daher portabel - sollte also auch in Jython nutzbar sein.
Ja, ja. Hatte ich schon verstanden. Ich kann sowieso kein Python nehmen, da ich auf das im Applicationserver eingebettete Jython angewiesen bin. Ich brauchte halt nur irgendwoher das py Lib.
Y0Gi hat geschrieben:Öffnen die Betrachter die Logdatei denn lokal oder beziehen sie diese über den Webserver? In letzterem Fall lässt sich das ja wrappen, d.h. ein Parser liest die (Text-)Logdatei und bastelt da XML draus, das dann an den Browser ausgeliefert wird.
Die gute Nachricht: Es läuft über nen Apachen. :)
Die schlechte: Die Konfiguration ist standardisiert und festgelegt. Da komm ich also nicht dran. :(

Das wäre aber sicher die eleganteste Lösung.
Antworten