ElementTree - das schreiben von XML etwas "verschönern&

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
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Hallo!

Ich bastel grad ein wenig mit XML und ElementTree herum.

habe nun schon mal folgendes Script:

Code: Alles auswählen

#!/usr/bin/env python

from elementtree.ElementTree import ElementTree as etree, parse


def read_news(id='latest', author=None, headline=None, file='news.xml'):
    tree = etree(file=file)
    root = tree.getroot()
    root_childs = root.getchildren()
    news = []
    for news_item in root_childs:
        news_item_childs = news_item.getchildren()
        tmp_news = {}
        for item in news_item_childs:
            tmp_news[item.tag] = item.text
        news.append((news_item.tag, news_item.get('id'), tmp_news))


    return news


if __name__ == '__main__':
    news = read_news()
    print news
welches folgende XML-Datei auswertet:

Code: Alles auswählen

<Root>
    <news id="1">
        <headline>TEST NEWS</headline>
        <author>EnTeQuAk</author>
        <content>Hello, World!</content>
    </news>
    <news id="2">
        <headline>TEST NEWS2</headline>
        <author>EnTeQuAk</author>
        <content>CONTENT 2</content>
    </news>
</Root>
So. Funktioniert erstmal so, wie ich mir das dachte.

Nur möchte ich nun etwas zu dieser Datei hinzufügen. Wie kann ich das machen, das ich auch diese Einrückung weiter fortsetze?

Ich habe irgentetwas von indent in der Doku gefunden. Kann aber leider kein richtiges Beispiel finden.

MfG EnTeQuAk
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

EnTeQuAk hat geschrieben:Nur möchte ich nun etwas zu dieser Datei hinzufügen. Wie kann ich das machen, das ich auch diese Einrückung weiter fortsetze?
Indem du die Datei nicht mit ElementTree bearbeitest. ElementTree lädt den Tree komplett und speichert den Tree komplett.

Also musst du die Datei überschreiben. Aber du kannst zum Schreiben zum Beispiel diese prettyprint-Funktionalität benutzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

hmm... prettyprint schaut schon mal schick aus ;)

Mal schauen, wie es in der Praxis ausschaut.
Wenn es die Möglichkeit gibt, würde ich gerne die Eingebaute Variante benutzen ;)

Mal schauen.

Danke erstmal!

MfG EnTeQuAk
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi!

Zum Ausspannen -- also, um die vielen Programm-Threads, die ich derzeit in meiner Bankomatschnittstelle einprogrammiert habe, zu vergessen -- :mrgreen: -- habe ich mich ein paar Stunden mit ElementTree und wxPython gespielt.

Das ist dabei raus gekommen: :twisted:

http://paste.pocoo.org/show/576/

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Das ist aber ein ziemlicher Hack, da ist das von der Effbot-Seite besser. Das schöne an ElementTree ist ja gerade das es gültiges XML generiert und sich dabei um Kodierung und Escapen von Daten kümmert. Kleiner Testfall:

Code: Alles auswählen

In [76]: a = etree.Element('smørebrød'.decode('utf-8'), {'test': '<\'"&>'})
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BlackJack hat geschrieben:Das ist aber ein ziemlicher Hack, da ist das von der Effbot-Seite besser. Das schöne an ElementTree ist ja gerade das es gültiges XML generiert und sich dabei um Kodierung und Escapen von Daten kümmert.
Hi BlackJack!

Da gebe ich dir natürlich Recht. Ich habe mich auch mit "indent" gespielt. Allerdings liefert mir das fehlerhafte Einrückungen, wenn ich mehrmals hintereinander einen News-Tag hinzufüge.

Hier der Paste: http://paste.pocoo.org/show/581/

Das ist das Ergebnis:

Code: Alles auswählen

<?xml version="1.0" encoding="utf-8"?>
<newsitems>
  <news id="1">
    <headline>asdf</headline>
    <author>asdf</author>
    <content>asdf</content>
  </news>
<news id="2">
    <headline>asdf</headline>
    <author>asdf</author>
    <content>sadf</content>
  </news>
<news id="3">
    <headline>asdf</headline>
    <author>sadf</author>
    <content>asdf</content>
  </news>
</newsitems>
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Oui, da war einer Fleißig ;)

Herzlichen Dank Gerold. Ich muss mir erstmal deinen ganzen Code anschauen und nachvollziehen ;) Die hälfte hab ich schon :D

Da sind ein paar Nette Sachen bei.

Herzlichen Dank nochmal! :)

MfG EnTeQuAk
Antworten