Tengo un programa que lee un documento xml de un socket. Tengo el documento xml almacenado en una cadena que me gustaría convertir directamente a un diccionario Python, de la misma manera que se hace en la simplejson
biblioteca de Django .
Toma como ejemplo:
str ="<?xml version="1.0" ?><person><name>john</name><age>20</age></person"
dic_xml = convert_to_dic(str)
Entonces dic_xml
se vería como{'person' : { 'name' : 'john', 'age' : 20 } }
python
xml
json
dictionary
xml-deserialization
usuario361526
fuente
fuente
Respuestas:
Este es un gran módulo que alguien creó. Lo he usado varias veces. http://code.activestate.com/recipes/410469-xml-as-dictionary/
Aquí está el código del sitio web por si el enlace falla.
Ejemplo de uso:
// O, si quieres usar una cadena XML:
fuente
xmltodict
biblioteca). La desventaja es que debe alojarlo usted mismo dentro de su proyecto.cElementTree
, simplemente cambie la primera línea a:from xml.etree import cElementTree as ElementTree
xmltodict (divulgación completa: lo escribí) hace exactamente eso:
fuente
El siguiente fragmento de XML-a-Python-dict analiza las entidades y los atributos que siguen esta "especificación" de XML a JSON . Es la solución más general que maneja todos los casos de XML.
Esta usado:
El resultado de este ejemplo (según la "especificación" vinculada anteriormente) debería ser:
No es necesariamente bonito, pero no es ambiguo, y las entradas XML más simples dan como resultado un JSON más simple. :)
Actualizar
Si desea hacer lo contrario , emitir una cadena XML desde un JSON / dict , puede usar:
fuente
d = {t.tag: {k:v[0] if len(v) == 1 else v for k, v in dd.iteritems()}}
ad = { t.tag: dict( (k, v[0] if len(v) == 1 else v) for k, v in dd.iteritems() ) }
cElementTree
olxml.etree
. Tenga en cuenta que cuando se usa Python 3, todos.iteritems()
deben cambiarse a.items()
(mismo comportamiento pero la palabra clave cambió de Python 2 a 3).Esta versión ligera, aunque no es configurable, es bastante fácil de adaptar según sea necesario y funciona en pitones antiguos. También es rígido, lo que significa que los resultados son los mismos independientemente de la existencia de atributos.
Entonces:
Resultados en:
fuente
Las versiones más recientes de las bibliotecas PicklingTools (1.3.0 y 1.3.1) admiten herramientas para convertir de XML a un dict de Python.
La descarga está disponible aquí: PicklingTools 1.3.1
Hay un poco de documentación de los convertidores aquí : la documentación se describen en detalle todas las decisiones y los problemas que surgirán cuando la conversión entre XML y diccionarios de Python (hay una serie de casos límite: atributos, listas, listas de anónimos, anónimo dicts, eval, etc. que la mayoría de los convertidores no manejan). Sin embargo, en general, los convertidores son fáciles de usar. Si un 'ejemplo.xml' contiene:
Luego para convertirlo en un diccionario:
Hay herramientas para convertir tanto en C ++ como en Python: C ++ y Python hacen conversión idéntica, pero C ++ es aproximadamente 60 veces más rápido
fuente
Puede hacerlo con bastante facilidad con lxml. Primero instálalo:
Aquí hay una función recursiva que escribí que hace el trabajo pesado por ti:
La siguiente variante conserva la clave / elemento principal:
Si solo desea devolver un subárbol y convertirlo a dict, puede usar Element.find () para obtener el subárbol y luego convertirlo:
Vea los documentos lxml aquí . ¡Espero que esto ayude!
fuente
Descargo de responsabilidad: este analizador XML modificado fue inspirado por Adam Clark. El analizador XML original funciona para la mayoría de los casos simples. Sin embargo, no funcionó para algunos archivos XML complicados. Depuré el código línea por línea y finalmente solucioné algunos problemas. Si encuentra algunos errores, hágamelo saber. Me alegra arreglarlo.
fuente
fuente
El analizador XML más fácil de usar para Python es ElementTree (a partir de 2.5x y más arriba está en la biblioteca estándar xml.etree.ElementTree). No creo que haya nada que haga exactamente lo que quieres fuera de la caja. Sería bastante trivial escribir algo para hacer lo que quiera con ElementTree, pero por qué convertir a un diccionario y por qué no simplemente usar ElementTree directamente.
fuente
El código de http://code.activestate.com/recipes/410469-xml-as-dictionary/ funciona bien, pero si hay varios elementos que son iguales en un lugar determinado de la jerarquía, simplemente los anula.
Agregué una cuña entre esas miradas para ver si el elemento ya existe antes de self.update (). Si es así, muestra la entrada existente y crea una lista de lo existente y lo nuevo. Cualquier duplicado posterior se agrega a la lista.
No estoy seguro de si esto se puede manejar con más gracia, pero funciona:
fuente
De @ K3 --- respuesta rnc (lo mejor para mí) He agregado pequeñas modificaciones para obtener un OrderedDict de un texto XML (algunas veces el orden es importante):
Siguiendo el ejemplo @ K3 --- rnc, puede usarlo:
Espero eso ayude ;)
fuente
Aquí hay un enlace a una solución ActiveState , y el código en caso de que desaparezca nuevamente.
fuente
En un momento tuve que analizar y escribir XML que solo consistía en elementos sin atributos, por lo que fue posible una asignación 1: 1 de XML a dict fácilmente. Esto es lo que se me ocurrió en caso de que alguien más no necesite atributos:
fuente
@dibrovsd: la solución no funcionará si el xml tiene más de una etiqueta con el mismo nombre
En su línea de pensamiento, modifiqué un poco el código y lo escribí para el nodo general en lugar de root:
fuente
He modificado una de las respuestas a mi gusto y para trabajar con varios valores con la misma etiqueta, por ejemplo, considere el siguiente código xml guardado en el archivo XML.xml
y en python
la salida es
fuente
Tengo un método recursivo para obtener un diccionario de un elemento lxml
fuente