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()
yaddAttribute()
)Soportar más de un tag hijo (implementar
__iter__
)