XMLWriter für python 2.4

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
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Montag 27. April 2009, 14:48

Hallo,

hier läuft ein FreeBSD 6.2 System mit Python 2.4.

Hier im Forum habe ich folgende Beiträge gefunden:
http://www.python-forum.de/post-57056.html#57056
http://www.python-forum.de/post-69709.html#69709

Bei mir existieren jedoch diese Module nicht

Code: Alles auswählen

% ipython
WARNING: Could not import user config!
 ('/home/xxx/.ipython/ipy_user_conf.py' does not exist? Please run '%upgrade')

Python 2.4.3 (#2, May  1 2007, 22:04:57)
Type "copyright", "credits" or "license" for more information.

IPython 0.7.2 -- An enhanced Interactive Python.
?       -> Introduction to IPython's features.
%magic  -> Information about IPython's 'magic' % functions.
help    -> Python's own help system.
object? -> Details about 'object'. ?object also works, ?? prints more.

In [1]: from xml.dom.minidom import parseString

In [2]: from xml.etree.ElementTree import Element, SubElement, tostring
---------------------------------------------------------------------------
exceptions.ImportError                               Traceback (most recent call last)

/home/xxx/<ipython console>

ImportError: No module named etree.ElementTree

In [3]: import elementtree.ElementTree as et
---------------------------------------------------------------------------
exceptions.ImportError                               Traceback (most recent call last)

/home/xxx/<ipython console>

ImportError: No module named elementtree.ElementTree
Gibt es noch andere Alternativen?

Im Moment habe ich das XML-File per Hand erstellt - eine XML-Writer Kklasse wäre jedoch eleganter 8)

mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Montag 27. April 2009, 15:20

Ich denke du hast ElementTree nicht installiert: http://effbot.org/zone/element-index.htm

Das ist erst seit 2.5 Teil der StdLib (und dort als xml.etree).
problembär

Montag 27. April 2009, 17:01

Hi,
Twilo hat geschrieben:eine XML-Writer Kklasse wäre jedoch eleganter
Da ich ElementTree auch nicht kannte, hab' ich mal so eine Klasse geschrieben:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import xml.dom

class XMLGenerator:

    def __init__(self, rootname):

        implement = xml.dom.getDOMImplementation()
        self.doc = implement.createDocument(None, rootname, None)

        rootname = self.prepareTag(rootname)

        self.last = self.doc
        self.elements = [self.doc]
        self.levels = [0]

    def addElem(self, elname, level):

        """This adds the element to the last node with the level 'level'."""

        elname = self.prepareTag(elname)

        if level:
            for i in range(len(self.levels) - 1, -1, -1):
                if self.levels[i] == level:
                    break

        elem = self.doc.createElement(elname)

        if level == 0:
            self.doc.documentElement.appendChild(elem)
        else:
            self.elements[i].appendChild(elem)

        self.elements.append(elem)
        self.levels.append(level + 1)
        self.last = elem

    def addAttrToLastElem(self, opt, val):
        opt = self.prepareTag(opt)
        self.last.setAttribute(opt, val)

    def addTextToLastElem(self, text):
        tnode = self.doc.createTextNode(text)
        self.last.appendChild(tnode)


    def prepareTag(self, a):

        a = a.replace(" ", "_")
        a = a.replace(",", "_oder_")
        a = a.replace("/", "_oder_")
        a = a.replace("&", "_u._")

        while "__" in a:
            a = a.replace("__", "_")

        return a

    def writeTo(self, fname): 

        fh = file(fname, "w")

        self.doc.writexml(fh,
                          indent='',
                          addindent='    ',
                          newl='\n',
                          encoding = "iso-8859-1")
        fh.close()
Man muß dabei die Elemente nacheinander anfügen. Dabei muß man der Methode ".addElem()" noch den Level der Verschachtelung mitgeben.
Mußt halt ein bißchen mit rumprobieren. Ist halt speziell für meine Zwecke. Aber so viele Methoden sind's ja nicht.

Gruß
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 27. April 2009, 17:18

problembär hat geschrieben:Da ich ElementTree auch nicht kannte, hab' ich mal so eine Klasse geschrieben
Naja, es gibt keinen sonderlich großen Sinn XML neu zu erfinden...
My god, it's full of CARs! | Leonidasvoice vs Modvoice
problembär

Montag 27. April 2009, 22:15

Wie gesagt, erst habe ich Tutorials wie

http://de.wikibooks.org/wiki/Python_unter_Linux:_XML

gelesen. Da wurde das so erklärt (in "Dive into Python" glaube ich auch immer noch).
Dann hab' ich meine Klasse drumgebaut.
Dann habe ich ElementTree entdeckt.

Jetzt ist die Frage, ob ich alles dafür umschreibe.

Gruß
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 27. April 2009, 22:18

problembär hat geschrieben:Da wurde das so erklärt (in "Dive into Python" glaube ich auch immer noch).
Ich denke dass das in Dive into Python 3 nicht mehr so sein wird[*] - allerdings ist das Kapitel 13 noch nicht online.

[*] Okay, ich habe nachgeschaut: lxml wird erwähnt werden, also kommt ElementTree definitiv ins Buch.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Dienstag 28. April 2009, 11:24

Hallo,
cofi hat geschrieben:Ich denke du hast ElementTree nicht installiert: http://effbot.org/zone/element-index.htm

Das ist erst seit 2.5 Teil der StdLib (und dort als xml.etree).
ok, funktioniert :-)

folgendes sollte dann mit python 2.4 und 2.5 laufen, oder?

Code: Alles auswählen

from xml.dom.minidom import parseString
try:
    from xml.etree.ElementTree import Element, SubElement, tostring
except:
    from elementtree.ElementTree import Element, SubElement, tostring
mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 28. April 2009, 13:07

Also das Except sollte einen ImportError abfangen...
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dienstag 28. April 2009, 14:04

`parseString` aus `xml.dom.minidom` brauchst du auch nicht. ElementTree kann das auch, am besten einfach mal die Doku durcharbeiten.

Das ist jetzt Geschmacksache, aber ich würde deinen Import als `as` schreiben:

Code: Alles auswählen

try:
    import xml.etree.ElementTree as etree
except ImportError:
    import elementtree.ElementTree as etree
`Element` an sich find ich nämlich relativ nichtssagend.
Antworten