11
votes

Convertir XML en dict Python

J'essaie de faire une classe de dict pour traiter un XML mais qu'il reste coincé, je manque vraiment d'idées. Si quelqu'un pouvait guider sur ce sujet serait génial.

code développé jusqu'à présent: xxx


11 commentaires

Il semble que cette question ait été répondue avant: Stackoverflow.com/Questtions/2148119/...


Quelle est votre sortie désirée?


@Josh je ne comprends pas ton ami idée


@robjohncox trouver la solution là-bas avant mais je n'avais pas de positif


@Ancxe quelque chose comme ceci: {"à": "TOVE", "Jani": "Jani", "Remettre": "Rappel", "Corps": "Ne m'oublie pas ce week-end!"}


@funktasmas: Vous ne voulez donc pas {"note": {"to": "TOVE", "À partir de": "Jani", "Remettre": "Rappel", "Body": "NE PAS Oubliez-moi ce week-end! "}} ? Voulez-vous toujours que le nœud ou voulez-vous toujours un niveau inférieur au sommet, ou voulez-vous toujours que les feuilles seulement, ou ...?


@Abarnert ne veut pas toujours que le nœud "Note" à d'autres moments, je peux avoir besoin d'un autre nœud


@funktasmas: Cela signifie-t-il que vous faire veulent la plus grande dict (avec "Remarque" mappé sur la dicte intérieure)? Ou que vous voulez des choses différentes à des moments différents et que vous ne pouvez pas décrire ce que vous voulez réellement?


@abarnert à laisser mon idée est claire avec un XML dans un dict, avec lequel prendre les informations dont vous avez besoin à l'époque, note, nom, etc.


@funktasmas: Je ne comprends pas votre réponse. Voulez-vous le plus grand dict de mon commentaire, ou pas? Sinon, quelle est la règle utilisée pour obtenir le plus petit dict de votre commentaire?


Dupliqué possible de Comment convertir XML en dict


4 Réponses :


6
votes

Vous devriez vérifier

https://github.com/martinblech/xmltodict

Je pense que c'est l'un des meilleurs gestionnaires standard pour XML de diger que j'ai vu.

Cependant, je devrais vous avertir que vous XML et DICT ne sont pas des structures de données absolument compatibles


2 commentaires

Merci pour votre réponse. Je suppose que non pas des structures entièrement compatibles et qu'il n'y a pas de solution aussi vite que dans le passé.


@funktasmas: Le seul gros problème pour les cas simples est que les nœuds XML peuvent avoir des attributs ainsi que des sous-nœuds, et vous devez décider de la manière de le représenter. xmltodict représente des attributs en tant que nœuds avec un préfixe @ sur leur nom, qui est un moyen de résoudre le problème, mais il existe d'autres possibilités, par exemple, vous pouvez gérer des nœuds avec < Code> __ getItem __ et attraits avec __ getattr __ .



21
votes

Vous pouvez utiliser xmltodict code> module: xxx pré>

qui produit un ordonnéddicddict code>: p> xxx pré>

qui peut être converti en dict si la commande n'a pas d'importance: p>

{u'body': u"Don't forget me this weekend!", u'to': u'Tove', u'from': u'Jani', u'heading': u'Reminder'}


5 commentaires

Merci pour l'aide, je l'apprécie vraiment, mais je pense toujours ou plutôt à regarder la façon dont il a effectué sans module supplémentaire, je vais essayer de toute façon.


@funktasmas: Si vous voulez voir comment le faire sans module supplémentaire, pourquoi ne pas regarder la source de xmltodict ? C'est quelques cents lignes de code python propre et bien commenté. Et cela va certainement être meilleur que n'importe quel piratage rapide et sale que quelqu'un propose une réponse à ce sujet.


@abarnert venait de voir comment ils développent le module, c'est peut-être un bon moyen de commencer.


@funktasmas: Compte tenu de la licence et de l'historique de développement du module, probablement le meilleur moyen de démarrer est de simplement le fourche et de commencer à jouer avec votre fourchette. De cette façon, si vous proposez tout ce qui manquait dans l'original et que vous souhaitez partager avec le monde, vous pouvez simplement soumettre une demande de retrait en amont.


@Abarnert Si j'ai du code développé pour cela, je n'ai aucun problème de partager des informations avec la communauté.



3
votes

Vous pouvez utiliser le bibliothèque LXML . Convertissez la chaîne en un objet XML en utilisant objectivement.fromstring , puis recherchez la méthode des objets dir. Par exemple: xxx

convertir l'objet XML en dict retournerait un dict: xxx

la chaîne XML que j'ai utilisée est une réponse de PaySech Paiements Paiements Juste pour montrer un exemple de monde réel.

Notez également que l'exemple ci-dessus n'est pas récursif, donc s'il y a des dict-dicts, vous devez faire une certaine récursive. Voir la fonction récursive que j'ai écrite que vous pouvez utiliser: xxx

heres une variante qui conserve la clé / élément parent: xxx p> et si vous voulez seulement retourner un sous-arbre et le convertir en dict, vous pouvez utiliser élément.find () : xxx

Il y a De nombreuses options pour accomplir cela, mais celui-ci est génial si vous utilisez déjà LXML. Dans cet exemple, lxml-3.4.2 a été utilisé.CHeers!


1 commentaires

Si vous voulez un vrai dict python (pas un dict d'objets LxML), alors mettez à jour xml_to_dict_recursion pour être renvoyer xml_object.pyval



6
votes

Vous penseriez qu'en maintenant, nous aurions une bonne réponse à celle-ci, mais nous ne l'avons apparemment pas. Après avoir examiné la moitié des douzaines de questions similaires sur Stackoverflow, voici ce qui a fonctionné pour moi: xxx

et c'est ainsi que vous l'utilisez: xxx p> espère qu'il aide: -)


1 commentaires

Cela a fonctionné pour moi. Je devais ajouter .getroot () à arborescence dans l'appel, comme dans etree2dict (arbre.getroot ()) . Peut-être que c'est parce que j'ai lu le XML à partir d'un fichier et non d'une chaîne? En tout cas, bonne réponse.