J'ai un programme qui lit un document xml à partir d'une socket. J'ai le document xml stocké dans une chaîne que je voudrais convertir directement en dictionnaire Python, de la même manière que dans Djangosimplejson
bibliothèque .
Prenons comme exemple:
str ="<?xml version="1.0" ?><person><name>john</name><age>20</age></person"
dic_xml = convert_to_dic(str)
Alors dic_xml
ressemblerait à{'person' : { 'name' : 'john', 'age' : 20 } }
python
xml
json
dictionary
xml-deserialization
utilisateur361526
la source
la source
Réponses:
C'est un excellent module que quelqu'un a créé. Je l'ai utilisé plusieurs fois. http://code.activestate.com/recipes/410469-xml-as-dictionary/
Voici le code du site Web au cas où le lien ne fonctionne pas.
Exemple d'utilisation:
// Ou, si vous souhaitez utiliser une chaîne XML:
la source
xmltodict
bibliothèque). L'inconvénient est que vous devez l'héberger vous-même au sein de votre projet.cElementTree
, changez simplement la première ligne en:from xml.etree import cElementTree as ElementTree
xmltodict (divulgation complète: je l'ai écrit) fait exactement cela:
la source
L'extrait de code XML-to-Python-dict suivant analyse les entités ainsi que les attributs suivant cette "spécification" XML-to-JSON . C'est la solution la plus générale pour tous les cas de XML.
C'est utilisé:
La sortie de cet exemple (selon la "spécification" liée ci-dessus) doit être:
Pas nécessairement joli, mais c'est sans ambiguïté, et des entrées XML plus simples se traduisent par un JSON plus simple. :)
Mettre à jour
Si vous voulez faire l' inverse , émettre une chaîne XML à partir d'un JSON / dict , vous pouvez utiliser:
la source
d = {t.tag: {k:v[0] if len(v) == 1 else v for k, v in dd.iteritems()}}
end = { t.tag: dict( (k, v[0] if len(v) == 1 else v) for k, v in dd.iteritems() ) }
cElementTree
oulxml.etree
. Notez que lors de l'utilisation de Python 3, tous.iteritems()
doivent être modifiés en.items()
(même comportement mais le mot-clé est passé de Python 2 à 3).Cette version légère, bien que non configurable, est assez facile à personnaliser selon les besoins et fonctionne dans les anciens pythons. De plus, il est rigide - ce qui signifie que les résultats sont les mêmes quelle que soit l'existence des attributs.
Alors:
Résulte en:
la source
Les versions les plus récentes des bibliothèques PicklingTools (1.3.0 et 1.3.1) prennent en charge les outils de conversion de XML en dict Python.
Le téléchargement est disponible ici: PicklingTools 1.3.1
Il y a pas mal de documentation pour les convertisseurs ici : la documentation décrit en détail toutes les décisions et les problèmes qui se poseront lors de la conversion entre les dictionnaires XML et Python (il existe un certain nombre de cas extrêmes: attributs, listes, listes anonymes, anonymes dicts, eval, etc. que la plupart des convertisseurs ne gèrent pas). En général, cependant, les convertisseurs sont faciles à utiliser. Si un 'example.xml' contient:
Ensuite, pour le convertir en dictionnaire:
Il existe des outils de conversion à la fois en C ++ et Python: le C ++ et Python effectuent une conversion identique, mais le C ++ est environ 60 fois plus rapide
la source
Vous pouvez le faire assez facilement avec lxml. Installez-le d'abord:
Voici une fonction récursive que j'ai écrite et qui fait le gros du travail pour vous:
La variante ci-dessous préserve la clé / l'élément parent:
Si vous souhaitez uniquement renvoyer un sous-arbre et le convertir en dict, vous pouvez utiliser Element.find () pour obtenir le sous-arbre, puis le convertir:
Consultez la documentation lxml ici . J'espère que ça aide!
la source
Avertissement: Cet analyseur XML modifié a été inspiré par Adam Clark L'analyseur XML original fonctionne pour la plupart des cas simples. Cependant, cela n'a pas fonctionné pour certains fichiers XML complexes. J'ai débogué le code ligne par ligne et j'ai finalement résolu quelques problèmes. Si vous trouvez des bugs, faites-le moi savoir. Je suis heureux de le réparer.
la source
la source
L'analyseur XML le plus simple à utiliser pour Python est ElementTree (à partir de 2.5x, il se trouve dans la bibliothèque standard xml.etree.ElementTree). Je ne pense pas qu'il y ait quoi que ce soit qui fasse exactement ce que vous voulez hors de la boîte. Ce serait assez trivial d'écrire quelque chose pour faire ce que vous voulez en utilisant ElementTree, mais pourquoi convertir en dictionnaire, et pourquoi pas simplement utiliser ElementTree directement.
la source
Le code de http://code.activestate.com/recipes/410469-xml-as-dictionary/ fonctionne bien, mais s'il y a plusieurs éléments qui sont identiques à un endroit donné dans la hiérarchie, il les remplace simplement.
J'ai ajouté un shim entre qui regarde pour voir si l'élément existe déjà avant self.update (). Si tel est le cas, fait apparaître l'entrée existante et crée une liste à partir de l'existant et du nouveau. Tous les doublons ultérieurs sont ajoutés à la liste.
Je ne sais pas si cela peut être géré plus gracieusement, mais cela fonctionne:
la source
De @ K3 --- réponse rnc (le meilleur pour moi), j'ai ajouté de petites modifications pour obtenir un OrderedDict à partir d'un texte XML (parfois, l'ordre est important):
En suivant l'exemple @ K3 --- rnc, vous pouvez l'utiliser:
J'espère que ça aide ;)
la source
Voici un lien vers une solution ActiveState - et le code au cas où il disparaîtrait à nouveau.
la source
À un moment donné, j'ai dû analyser et écrire du XML qui ne se composait que d'éléments sans attributs, donc un mappage 1: 1 de XML à dict était possible facilement. Voici ce que j'ai proposé au cas où quelqu'un d'autre n'aurait pas besoin d'attributs:
la source
@dibrovsd: La solution ne fonctionnera pas si le xml a plus d'une balise avec le même nom
Dans votre ligne de pensée, j'ai un peu modifié le code et l'ai écrit pour le nœud général au lieu de la racine:
la source
J'ai modifié l'une des réponses à mon goût et pour travailler avec plusieurs valeurs avec la même balise, par exemple, considérez le code xml suivant enregistré dans le fichier XML.xml
et en python
la sortie est
la source
J'ai une méthode récursive pour obtenir un dictionnaire à partir d'un élément lxml
la source