Python: Extraire des informations à partir de xml à dictionnaire
J'ai besoin d'extraire des informations à partir d'un fichier xml, de l'isoler de balises xml avant et après, de stocker les informations dans un dictionnaire, puis la boucle à travers le dictionnaire pour imprimer une liste. Je suis un débutant absolu, donc j'aimerais le garder aussi simple que possible et je m'excuse si la façon dont j'ai décrit ce que j'aimerais faire, ne pas faire beaucoup de sens.
voici ce que j'ai jusqu'à présent.
for line in open("/people.xml"):
if "name" in line:
print (line)
if "age" in line:
print(line)
Courant De Sortie:
<name>John</name>
<age>14</age>
<name>Kevin</name>
<age>10</age>
<name>Billy</name>
<age>12</age>
De Sortie Désiré
Name Age
John 14
Kevin 10
Billy 12
edit - Donc, en utilisant le code ci-dessous je peux obtenir de la sortie:
{'Billy': '12', 'John': '14', 'Kevin': '10'}
Personne ne sait comment les obtenir à partir de ce à un tableau avec les en-têtes comme ma sortie désirée?
- Vous devriez être en utilisant
xml.dom
. Ça va rendre votre vie beaucoup plus facile. - J'ai besoin d'être à l'aide de python, je suis plus particulièrement à l'aide d'INACTIVITÉ sur un mac.
InformationsquelleAutor user1975140 | 2013-01-14
Vous devez vous connecter pour publier un commentaire.
essayer xmldict (Convertir xml en python dictionnaires, et vice-versa.):
ou essayer xmlmapper (liste de python dictionnaire avec la relation parent-enfant):
code ci-dessus donnera générateur. Lorsque vous parcourez, vous obtiendrez des informations dans
dict
clés; commetag
,text
,xmlattb
,tail
et plus d'informations dansxmlinfo
. Iciroot
élément auraparentid
informations0
.Utiliser un Analyseur XML pour cela. Par exemple,
Il me semble que c'est un exercice pour apprendre comment analyser ce XML manuellement plutôt que de simplement en tirant une bibliothèque sur le sac pour le faire pour vous. Si je me trompe, je vous suggère de regarder le udacity vidéo par Steve Huffman qui peut être trouvé ici: http://www.udacity.com/view#Course/cs253/CourseRev/apr2012/Unit/362001/Nugget/365002. Il explique comment utiliser le minidom module pour analyser léger fichiers xml comme ces.
Maintenant, le premier point que je veux faire dans ma réponse, c'est que vous ne voulez pas créer un dictionnaire python pour imprimer l'ensemble de ces valeurs. Un dictionnaire python est tout simplement un ensemble de touches qui correspondent à des valeurs. Il n'y a aucun ordre, et ainsi de traversée dans l'ordre où elles apparaissent dans le fichier est une douleur dans le cul. Vous essayez d'imprimer tous les noms avec leurs âges correspondants, donc une structure de données comme une liste de tuples serait probablement mieux adapté pour rassembler vos données.
Il semble que la structure de votre fichier xml, c'est que chaque étiquette de nom est remplacé par un âge de balise qui lui correspond. Il semble également qu'une seule balise de nom par ligne. Cela rend les choses assez simples. Je ne vais pas écrire le plus efficace ou de solution universelle à ce problème, mais au lieu de cela, je vais essayer de faire le code le plus simple à comprendre que je peux.
Donc, nous allons d'abord créer une liste pour stocker les données:
Nous allons ensuite créer une liste pour stocker les données:
a_list = []
Maintenant, ouvrez votre fichier, et initialiser un couple de variables pour stocker chaque nom et âge:
Maintenant, pour chaque ligne dans le fichier, nous avons voulu déterminer si elle contient un utilisateur. Si il l'a fait, nous avons voulu extraire le nom. Nous allons créer une fonction utilisée pour ce faire:
Maintenant, nous devons créer une fonction pour analyser la ligne pour l'âge d'un utilisateur. Nous pouvons le faire d'une manière similaire à la fonction précédente, mais nous savons qu'une fois que nous avons un âge, elle sera ajoutée à la liste immédiatement. En tant que tel, nous n'avons jamais besoin de nous préoccuper de l'âge de la valeur précédente. La fonction peut donc ressembler à ceci:
Enfin, vous souhaitez imprimer la liste. Vous pouvez le faire comme suit:
Espère que cela a aidé. Je n'ai pas testé mon code, donc il peut encore être légèrement buggé. Les concepts sont là, cependant. 🙂
Voici une autre façon en utilisant lxml bibliothèque:
Pour préserver le nœud parent, utilisez ceci à la place:
Et si vous voulez seulement de retour d'un sous-arbre et le convertir en dict, vous pouvez utiliser Élément.find() :
Voir lxml documentation.