En este ejemplo se muestra cómo convertir un string desde y hacia un objeto simple que representa el XML (código usado en Factura Electronica)

import xml.dom.minidom

class SimpleXMLElement:
    "Clase para Manejo simple de XMLs (simil PHP)"
    def __init__(self, text = None, element = None, document = None):
        if text:
            self.__document = xml.dom.minidom.parseString(text)
            self.__element = self.__document.documentElement
        else:
            self.__element = element
            self.__document = document
    def addChild(self,tag,text=None):
        element = self.__document.createElement(tag)
        if text:
            element.appendChild(self.__document.createTextNode(str(text)))
        self.__element.appendChild(element)
    def asXML(self,filename=None):
        return self.__document.toxml('utf8')
    def __getattr__(self,tag):
        try:
            return SimpleXMLElement(
                element=self.__element.getElementsByTagName(tag)[0],
                document=self.__document)
        except:
            raise RuntimeError("Tag not found: %s" % tag)
    def __getitem__(self,item):
        return getattr(self,item)
    def __contains__( self, item):
        return self.__element.getElementsByTagName(item)
    def __unicode__(self):
        return self.__element.childNodes[0].data
    def __str__(self):
        return self.__element.childNodes[0].data.encode("utf8","ignore")
    def __repr__(self):
        return repr(self.__str__())
    def __int__(self):
        return int(self.__str__())
    def __float__(self):
        return float(self.__str__())

Simplemente creamos un objeto de tipo SimpleXmlElement pasandole el string y obtenemos el objeto parseado. Se puede:

  • Acceder por ítem (como si fuera un dict).
  • Acceder por atributo (como si fuera un objeto).
  • Preguntar con in si un tag es hijo.
  • Al acceder se devuelven elementos xml, por lo que hay que convertirlos a str, int, float, etc.
>>> from simplexmlelement import SimpleXMLElement
>>> span = SimpleXMLElement('<span><a href="google.com">google</a><prueba><i>1</i><float>1.5</float></prueba></span>')
>>> print str(span.a)
google
>>> print float(span.prueba.i)
1
>>> print float(span.prueba.float)
1.5

Faltaría:

  • Acceder a los atributos de los tags (quizás por ítem simil diccionario o via attributes() y addAttribute())
  • Soportar más de un tag hijo (implementar __iter__)