2009-06-19 15 views
58

Hay un sencillo módulo de serialización JSON con el nombre "simplejson" que serializa fácilmente objetos de Python a JSON.Serialize Python dictionary to XML

Estoy buscando un módulo similar que pueda serializar a XML.

Respuesta

13
+4

> http://code.activestate.com/recipes/415983/ Éste no se serializa a XML solo al formato Marshal. Y tampoco me gusta sys.exit en Exception. > http://sourceforge.net/projects/pyxser/ Éste no es BSD. Lo siento, olvidé mencionar, estoy buscando el módulo de Python o BSD, por lo que puedo distribuirlo con mi software BSD. Los últimos 2 - para servicios web, estoy buscando un serializador XML regular. – zinovii

+1

zdmytriv: puede distribuir una biblioteca LGPL con su código BSD sin responsabilidades. – nosklo

+0

@nosklo: No sabía que puedes hacer eso. Ahora lo sé, gracias. – zinovii

17

Hay huTools.structured.dict2xml que trata de ser compatible con simplejson en espíritu. Puede darle pistas sobre cómo envolver las subestructuras anidadas. Compruebe la documentación para huTools.structured.dict2et que devuelve ElementTree Objetos en su lugar si las cadenas devueltas por dict2xml.

>>> data = {"kommiauftragsnr":2103839, "anliefertermin":"2009-11-25", "prioritaet": 7, 
... "ort": u"Hücksenwagen", 
... "positionen": [{"menge": 12, "artnr": "14640/XL", "posnr": 1},], 
... "versandeinweisungen": [{"guid": "2103839-XalE", "bezeichner": "avisierung48h", 
...       "anweisung": "48h vor Anlieferung unter 0900-LOGISTIK avisieren"}, 
... ]} 

>>> print ET.tostring(dict2et(data, 'kommiauftrag', 
... listnames={'positionen': 'position', 'versandeinweisungen': 'versandeinweisung'})) 
'''<kommiauftrag> 
<anliefertermin>2009-11-25</anliefertermin> 
<positionen> 
    <position> 
     <posnr>1</posnr> 
     <menge>12</menge> 
     <artnr>14640/XL</artnr> 
    </position> 
</positionen> 
<ort>H&#xC3;&#xBC;cksenwagen</ort> 
<versandeinweisungen> 
    <versandeinweisung> 
     <bezeichner>avisierung48h</bezeichner> 
     <anweisung>48h vor Anlieferung unter 0900-LOGISTIK avisieren</anweisung> 
     <guid>2103839-XalE</guid> 
    </versandeinweisung> 
</versandeinweisungen> 
<prioritaet>7</prioritaet> 
<kommiauftragsnr>2103839</kommiauftragsnr> 
</kommiauftrag>''' 
+0

huTools no es compatible con Python 3 (el objeto '' 'dict 'no tiene atributo' iteritems''''). – thomaskonrad

+0

¿Cuáles son los términos de licencia de esta cosa? ¿Puedo usarlo en mi aplicación comercial? –

11

prueba este. único problema que no utilizan atributos (ya que no me gusta de ellos)
dict2xml on pynuggets.wordpress.com
dict2xml on activestate

from xml.dom.minidom import Document 
import copy 

class dict2xml(object): 
    doc  = Document() 

    def __init__(self, structure): 
     if len(structure) == 1: 
      rootName = str(structure.keys()[0]) 
      self.root = self.doc.createElement(rootName) 

      self.doc.appendChild(self.root) 
      self.build(self.root, structure[rootName]) 

    def build(self, father, structure): 
     if type(structure) == dict: 
      for k in structure: 
       tag = self.doc.createElement(k) 
       father.appendChild(tag) 
       self.build(tag, structure[k]) 

     elif type(structure) == list: 
      grandFather = father.parentNode 
      tagName  = father.tagName 
      grandFather.removeChild(father) 
      for l in structure: 
       tag = self.doc.createElement(tagName) 
       self.build(tag, l) 
       grandFather.appendChild(tag) 

     else: 
      data = str(structure) 
      tag  = self.doc.createTextNode(data) 
      father.appendChild(tag) 

    def display(self): 
     print self.doc.toprettyxml(indent=" ") 

if __name__ == '__main__': 
    example = {'auftrag':{"kommiauftragsnr":2103839, "anliefertermin":"2009-11-25", "prioritaet": 7,"ort": u"Huecksenwagen","positionen": [{"menge": 12, "artnr": "14640/XL", "posnr": 1},],"versandeinweisungen": [{"guid": "2103839-XalE", "bezeichner": "avisierung48h","anweisung": "48h vor Anlieferung unter 0900-LOGISTIK avisieren"},]}} 
    xml = dict2xml(example) 
    xml.display() 
+1

Aquí hay algún problema con la creación de otra instancia de dict2xml 'xml.dom.HierarchyRequestErr: dos elementos del documento no permitidos', , así que agregué el método de desvinculación: ' def unlink (self): self.doc.unlink() ' –

2

mayoría de los objetos en Python se representan como predice debajo:

>>> class Fred(object) : 
... def __init__(self, n) : self.n = n 
... 
>>> a = Fred(100) 
>>> print a.__dict__ 
{'n': 100} 

Así que esto es similar a preguntando cómo convertir dicts a XML. Hay herramientas para convertir dict a/desde XML en:

http://www.picklingtools.com

Aquí está un ejemplo sencillo:

>>> import xmltools 

    >>> d = {'a':1, 'b':2.2, 'c':'three' } 
    >>> xx = xmltools.WriteToXMLString(d) 
    >>> print xx 
    <?xml version="1.0" encoding="UTF-8"?> 
    <top> 
     <a>1</a> 
     <b>2.2</b> 
     <c>three</c> 
    </top> 

Hay una gran cantidad de documentación en el sitio web que muestra ejemplos:

XML Tools Manual

Es difícil convertir "exactamente" entre dicts y XML: ¿Qué es un lista? ¿Qué haces con los atributos? ¿Cómo manejas las teclas numéricas? Muchos de estos problemas han sido abordados y se tratan en la documentación de herramientas XML (arriba).

¿Te importa la velocidad? ¿O la facilidad de uso es importante? Hay un módulo C++ puro (todo escrito en C++), un módulo puro de Python (todo escrito en Python) y un módulo de extensión Python C (escrito en C++, pero envuelto para que Python pueda llamarlo). El módulo de extensión C++ y Python C son órdenes de magnitud más rápidos, pero por supuesto requieren compilación para ponerse en marcha. El módulo de Python debería funcionar, pero es más lento:

8

Escribí una función simple que serializa diccionarios a xml (menos de 30 líneas).

de uso:

mydict = { 
    'name': 'The Andersson\'s', 
    'size': 4, 
    'children': { 
     'total-age': 62, 
     'child': [ 
      { 
       'name': 'Tom', 
       'sex': 'male', 
      }, 
      { 
       'name': 'Betty', 
       'sex': 'female', 
      } 
     ] 
    }, 
} 
print(dict2xml(mydict, 'family')) 

Resultados:

<family name="The Andersson's" size="4"> 
     <children total-age="62"> 
       <child name="Tom" sex="male"/> 
       <child name="Betty" sex="female"/> 
     </children> 
</family> 

La fuente completo (incluyendo un ejemplo) se pueden encontrar en https://gist.github.com/reimund/5435343/

Nota: Esta función serializará entradas del diccionario como atributos en lugar de nodos de texto. Modificarlo para apoyar el texto sería muy fácil.