Seite 1 von 1

XMLWriter für python 2.4

Verfasst: Montag 27. April 2009, 14:48
von Twilo
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

Verfasst: Montag 27. April 2009, 15:20
von cofi
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).

Verfasst: Montag 27. April 2009, 17:01
von problembär
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ß

Verfasst: Montag 27. April 2009, 17:18
von Leonidas
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...

Verfasst: Montag 27. April 2009, 22:15
von problembär
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ß

Verfasst: Montag 27. April 2009, 22:18
von Leonidas
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.

Verfasst: Dienstag 28. April 2009, 11:24
von Twilo
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

Verfasst: Dienstag 28. April 2009, 13:07
von Leonidas
Also das Except sollte einen ImportError abfangen...

Verfasst: Dienstag 28. April 2009, 14:04
von cofi
`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.