He visto una buena cantidad de código XML-> JSON desgarbado en la web, y después de haber interactuado un poco con los usuarios de Stack, estoy convencido de que esta multitud puede ayudar más que las primeras páginas de resultados de Google.
Por lo tanto, estamos analizando una fuente de información meteorológica, y necesitamos poblar widgets meteorológicos en una multitud de sitios web. Estamos buscando soluciones basadas en Python.
Este feed RSS público de weather.com es un buen ejemplo de lo que estaríamos analizando ( nuestro feed de weather.com real contiene información adicional debido a una asociación con ellos ).
En pocas palabras, ¿cómo deberíamos convertir XML a JSON usando Python?
xmltodict (divulgación completa: lo escribí) puede ayudarlo a convertir su XML a una estructura dict + list + string, siguiendo este "estándar" . 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 a JSON:
fuente
bs4
puede hacer el trabajo de xml para dictar, es extremadamente fácil usar la bibliotecaPuede usar la biblioteca xmljson para convertir usando diferentes convenciones JSON XML .
Por ejemplo, este XML:
se traduce a través de la convención BadgerFish en esto:
y a través de la convención GData en esto (los atributos no son compatibles):
... y a través de la convención de Parker en esto (los atributos no son compatibles):
Es posible convertir de XML a JSON y de JSON a XML utilizando las mismas convenciones:
Divulgación: escribí esta biblioteca. Espero que ayude a los futuros buscadores.
fuente
Si en algún momento obtienes solo el código de respuesta en lugar de todos los datos, entonces aparecerá un error como json parse , por lo que debes convertirlo como texto
fuente
Aquí está el código que construí para eso. No hay análisis de los contenidos, solo conversión simple.
fuente
Hay un método para transportar el marcado basado en XML como JSON que le permite volver a convertirse sin pérdidas a su forma original. Ver http://jsonml.org/ .
Es una especie de XSLT de JSON. Espero que le sea útil
fuente
Para cualquiera que todavía pueda necesitar esto. Aquí hay un código más nuevo y simple para hacer esta conversión.
fuente
Es posible que desee echar un vistazo a http://designtheory.org/library/extrep/designdb-1.0.pdf . Este proyecto comienza con una conversión de XML a JSON de una gran biblioteca de archivos XML. Se realizó mucha investigación en la conversión, y se produjo el mapeo intuitivo más simple XML -> JSON (se describe al principio del documento). En resumen, convierta todo a un objeto JSON y coloque bloques repetidos como una lista de objetos.
objetos que significan pares clave / valor (diccionario en Python, hashmap en Java, objeto en JavaScript)
No hay una asignación a XML para obtener un documento idéntico, la razón es que se desconoce si un par clave / valor era un atributo o un
<key>value</key>
, por lo tanto, esa información se pierde.Si me preguntas, los atributos son un truco para comenzar; luego, de nuevo, funcionaron bien para HTML.
fuente
Bueno, probablemente la forma más simple es analizar el XML en diccionarios y luego serializarlo con simplejson.
fuente
Sugeriría no ir a una conversión directa. Convierta XML a un objeto, luego del objeto a JSON.
En mi opinión, esto da una definición más clara de cómo se corresponden el XML y JSON.
Lleva tiempo hacerlo bien e incluso puede escribir herramientas para ayudarlo a generar parte de él, pero se vería más o menos así:
fuente
Encontré recortes XML simples, el uso de expresiones regulares ahorraría problemas. Por ejemplo:
Para hacerlo mediante el análisis XML, como dijo @Dan, no existe una solución única porque los datos son diferentes. Mi sugerencia es usar lxml. Aunque no ha terminado con json, lxml.objectify da buenos resultados silenciosos:
fuente
Si bien las bibliotecas incorporadas para el análisis XML son bastante buenas, soy parcial con lxml .
Pero para analizar las fuentes RSS, recomendaría Universal Feed Parser , que también puede analizar Atom. Su principal ventaja es que puede digerir incluso la mayoría de los alimentos malformados.
Python 2.6 ya incluye un analizador JSON, pero una versión más nueva con velocidad mejorada está disponible como simplejson .
Con estas herramientas, crear su aplicación no debería ser tan difícil.
fuente
Mi respuesta aborda el caso específico (y algo común) en el que realmente no necesita convertir todo el xml a json, pero lo que necesita es atravesar / acceder a partes específicas del xml, y necesita que sea rápido , y simple (usando operaciones json / dict-like).
Acercarse
Para esto, es importante tener en cuenta que analizar un xml para usar etree
lxml
es muy rápido. La parte lenta en la mayoría de las otras respuestas es el segundo paso: atravesar la estructura etree (generalmente en python-land), convertirla a json.Lo que me lleva al enfoque que encontré mejor para este caso: analizar el xml usando
lxml
, y luego envolver los nodos etree (perezosamente), proporcionándoles una interfaz tipo dict.Código
Aquí está el código:
Esta implementación no está completa, por ejemplo, no admite de manera clara los casos en que un elemento tiene texto y atributos, o texto y elementos secundarios (solo porque no lo necesitaba cuando lo escribí ...) Debería ser fácil para mejorarlo, sin embargo.
Velocidad
En mi caso de uso específico, donde necesitaba únicos elementos procesos específicos del xml, este enfoque dio un suprising y aceleración sorprendente en un factor de 70 (!) En comparación con el uso de @ Martin Blech xmltodict y luego atravesar el dict directamente.
Prima
Como beneficio adicional, dado que nuestra estructura ya es similar a un dict, obtenemos otra implementación alternativa de forma
xml2json
gratuita. Solo necesitamos pasar nuestra estructura tipo dict ajson.dumps
. Algo como:Si su xml incluye atributos, necesitaría usar algo alfanumérico
attr_prefix
(por ejemplo, "ATTR_"), para asegurarse de que las claves son claves json válidas.No he evaluado esta parte.
fuente
json.dumps(tree)
, dice que el objeto del tipo 'ETreeDictWrapper' no es serializable JSONCuando hago algo con XML en Python, casi siempre uso el paquete lxml. Sospecho que la mayoría de la gente usa lxml. Podrías usar xmltodict pero tendrás que pagar la penalización de analizar el XML nuevamente.
Para convertir XML a json con lxml usted:
Yo uso la siguiente clase en mis proyectos. Usa el método toJson.
El resultado del main integrado es:
Cuál es una transformación de este xml:
fuente
jsonpickle o si está utilizando feedparser, puede probar feed_parser_to_json.py
fuente
Este material aquí se mantiene activamente y hasta ahora es mi favorito: xml2json en python
fuente
echa un vistazo a lxml2json (divulgación: lo escribí)
https://github.com/rparelius/lxml2json
es muy rápido, liviano (solo requiere lxml), y una ventaja es que tiene control sobre si ciertos elementos se convierten en listas o dictados
fuente
Puedes usar declxml. Tiene características avanzadas como atributos múltiples y soporte anidado complejo. Solo necesita escribir un procesador simple para ello. También con el mismo código, también puede volver a convertir a JSON. Es bastante sencillo y la documentación es impresionante.
Enlace: https://declxml.readthedocs.io/en/latest/index.html
fuente
Preparar datos en Python : para crear JSON primero debe preparar los datos en python. Podemos usar List and Dictionary en Python para preparar los datos.
Lista de Python <==> Matriz JSON
Diccionario Python <==> Objeto JSON (Formato de valor clave) Verifique esto para obtener más detalles
https://devstudioonline.com/article/create-json-and-xml-in-python
fuente
Para representar datos en formato JSON
En json , repetimos datos en formato de clave y valor
Para representar datos en formato XML
fuente