Seite 1 von 1

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

Verfasst: Samstag 6. Januar 2007, 18:34
von EnTeQuAk
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

Re: ElementTree - das schreiben von XML etwas "verschön

Verfasst: Samstag 6. Januar 2007, 18:53
von Leonidas
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.

Verfasst: Samstag 6. Januar 2007, 19:23
von EnTeQuAk
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

Verfasst: Samstag 6. Januar 2007, 22:32
von gerold
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
:-)

Verfasst: Sonntag 7. Januar 2007, 00:10
von 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': '<\'"&>'})

Verfasst: Sonntag 7. Januar 2007, 01:08
von gerold
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
:-)

Verfasst: Sonntag 7. Januar 2007, 11:05
von EnTeQuAk
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