pasar parser dict python xml json

parser - xml to dict python



¿Cómo convertir XML a JSON en Python? (7)

Posible duplicado:
¿Convirtiendo XML a JSON usando Python?

Estoy trabajando en App Engine y necesito convertir un documento XML que se recupera de un servidor remoto en un objeto JSON equivalente.

Estoy usando xml.dom.minidom para analizar los datos XML que devuelve urlfetch . También estoy tratando de usar django.utils.simplejson para convertir el documento XML analizado en JSON. Estoy completamente perdido sobre cómo unir los dos. Debajo está el código con el que estoy retocando:

from xml.dom import minidom from django.utils import simplejson as json #pseudo code that returns actual xml data as a string from remote server. result = urlfetch.fetch(url,'''',''get''); dom = minidom.parseString(result.content) json = simplejson.load(dom) self.response.out.write(json)


Creo que el formato XML puede ser tan diverso que es imposible escribir un código que pueda hacer esto sin un formato XML definido muy estricto. Esto es lo que quiero decir:

<persons> <person> <name>Koen Bok</name> <age>26</age> </person> <person> <name>Plutor Heidepeen</name> <age>33</age> </person> </persons>

Se convertiría

{''persons'': [ {''name'': ''Koen Bok'', ''age'': 26}, {''name'': ''Plutor Heidepeen'', ''age'': 33}] }

Pero, ¿qué sería esto?

<persons> <person name="Koen Bok"> <locations name="defaults"> <location long=123 lat=384 /> </locations> </person> </persons>

¿Ves lo que quiero decir?

Editar: acabo de encontrar este artículo: "standard"


El consejo de Soviut para lxml objectify es bueno. Con un simplejson especialmente subclasificado, puede convertir un resultado de objectify lxml en json.

import simplejson as json import lxml class objectJSONEncoder(json.JSONEncoder): """A specialized JSON encoder that can handle simple lxml objectify types >>> from lxml import objectify >>> obj = objectify.fromstring("<Book><price>1.50</price><author>W. Shakespeare</author></Book>") >>> objectJSONEncoder().encode(obj) ''{"price": 1.5, "author": "W. Shakespeare"}'' """ def default(self,o): if isinstance(o, lxml.objectify.IntElement): return int(o) if isinstance(o, lxml.objectify.NumberElement) or isinstance(o, lxml.objectify.FloatElement): return float(o) if isinstance(o, lxml.objectify.ObjectifiedDataElement): return str(o) if hasattr(o, ''__dict__''): #For objects with a __dict__, return the encoding of the __dict__ return o.__dict__ return json.JSONEncoder.default(self, o)

Ver la docstring por ejemplo de uso, esencialmente pasas el resultado de lxml objectify al método de codificación de una instancia de objectJSONEncoder

Tenga en cuenta que el punto de Koen es muy válido aquí, la solución anterior solo funciona para xml simplemente anidado y no incluye el nombre de los elementos raíz. Esto podría ser arreglado.

He incluido esta clase en una esencia aquí: http://gist.github.com/345559


En general, desea pasar de XML a objetos regulares de su idioma (ya que generalmente hay herramientas razonables para hacerlo, y es la conversión más difícil). Y luego desde Plain Old Object producen JSON: también hay herramientas para esto, y es una serialización bastante simple (ya que JSON es "Notación de objetos", ajuste natural para serializar objetos). Supongo que Python tiene su conjunto de herramientas.


Escribí una pequeña secuencia de comandos basada en línea de comandos de Python basada en pesterfesh que hace exactamente esto:

https://github.com/hay/xml2json


Jacob Smullyan escribió una pesterfish llamada pesterfish que usa ElementTree de effbot para convertir XML a JSON.


Una posibilidad sería usar Objectify o ElementTree del módulo lxml . Una versión anterior de ElementTree también está disponible en el módulo python xml.etree. Cualquiera de estos obtendrá su xml convertido a objetos de Python, que luego puede usar simplejson para serializar el objeto a JSON.

Si bien esto puede parecer un paso intermedio doloroso, comienza a tener más sentido cuando se trata de objetos XML y Python normales.


xmltodict (divulgación completa: lo escribí) puede ayudarte a convertir tu XML a una estructura de cadena dict + list +, siguiendo este "standard" . Está basado en Expat , por lo que es muy rápido y no necesita cargar todo el árbol XML en la memoria.

Una vez que tenga esa estructura de datos, puede serializarla en JSON:

import xmltodict, json o = xmltodict.parse(''<e> <a>text</a> <a>text</a> </e>'') json.dumps(o) # ''{"e": {"a": ["text", "text"]}}''