Bonjour,
j'effectue un stage dans une entreprise et je suis entrain de me former au langage python. L'entreprise me contraint à utiliser la version 2.2.1.
J'ai écrit un code qui permet de parser un xml, dans lequel sont stockés des personnes (principe du carnet d'adresse mais très simplifié). Mon premier fichier xml a été ecrit manuellement et il est parsé sans problème. Ensuite j'ai décider de créer de nouveaux objets Personnes qui seront stockés dans un deuxième fichier. Pour cela j'utilise la méthode writeXML. Le fichier est bien écrit sauf que quand je veux le lire le parse ne fonctionne plus. En réalité il fonctionne mais mes valeur de balises sont des chaînes vides.
Le premier fichier xml : personnes.xml
Mon application python : testDom.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<?xml version="1.0" ?> <quil> <personne> <nom>Durant</nom> <prenom>Stephan</prenom> <adresse> <ville>Bruxelles</ville> </adresse> </personne> <personne> <nom>Dupont</nom> <prenom>Henri</prenom> <adresse/> </personne> </quil>
Resultat du parsing de personnes.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134 #!/usr/bin/env python #coding=utf-8 from xml.dom.minidom import parse from xml.dom.minidom import Document class Adresse: ville = None def __init__(self): pass class Personne: nom = None prenom = None adresse = Adresse() def __init__(self): pass class XmlToPersonnes: __currentNode__ = None __personList__ = None def __init__(self, fichier): self.realXml(fichier) def realXml(self, fichier): self.doc = parse(fichier) def getRootElement(self): if self.__currentNode__ == None: self.__currentNode__ = self.doc.documentElement print str(self.__currentNode__) return self.__currentNode__ def getPersonnes(self): if self.__personList__ != None: return self.__personList__ = [] for personnes in self.getRootElement().getElementsByTagName("personne"): if personnes.nodeType == personnes.ELEMENT_NODE: p = Personne() print "nom = ",self.getText(personnes.getElementsByTagName("nom")[0]) try: p.nom = self.getText(personnes.getElementsByTagName("nom")[0]) p.prenom = self.getText(personnes.getElementsByTagName("prenom")[0]) p.adresse = self.getAdresse(personnes.getElementsByTagName("adresse")[0]) except: print "un des TAGS suivant est manquents : nom, prenom, adresse" self.__personList__.append(p) return self.__personList__ def getAdresse(self, node): adress = Adresse() try: adress.ville = self.getText(node.getElementsByTagName("ville")[0]) except: adress.ville = None return adress def getText(self, node): return node.childNodes[0].nodeValue class PersonnesToXml: def __init__(self): self.doc = Document() def setPersonnes(self, personnes): quil = self.doc.createElement("quil") self.doc.appendChild(quil) for pers in personnes: personne = self.doc.createElement("personne") quil.appendChild(personne) nom = self.doc.createElement("nom") personne.appendChild(nom) nomText = self.doc.createTextNode(pers.nom) nom.appendChild(nomText) prenom = self.doc.createElement("prenom") personne.appendChild(prenom) prenomText = self.doc.createTextNode(pers.prenom) prenom.appendChild(prenomText) adresse = self.doc.createElement("adresse") personne.appendChild(adresse) ville = self.doc.createElement("ville") adresse.appendChild(ville) villeText = self.doc.createTextNode(pers.adresse.ville) ville.appendChild(villeText) def sauvegarderXml(self): fichier = open("carnet.xml", "w") self.doc.writexml(fichier, " ", "", "\n") fichier.close() if __name__ == "__main__": x = XmlToPersonnes("carnet.xml") # x = XmlToPersonnes("personnes.xml") for personne in x.getPersonnes(): print "*********************" print personne.nom print personne.prenom print personne.adresse.ville print "*********************" a1 = Adresse() a1.ville = "OSNY" p1 = Personne() p1.nom = "BROUARD" p1.prenom = "Bastien" p1.adresse = a1 a2 = Adresse() a2.ville = "CERGY" p2 = Personne() p2.nom = "LESAGE" p2.prenom = "Olivier" p2.adresse = a2 p3 = Personne() p3.nom = "RICHARD" p3.prenom = "Yoan" p3.adresse = a1 listPersonnes = [] listPersonnes.append(p1) listPersonnes.append(p2) listPersonnes.append(p3) ptx = PersonnesToXml() ptx.setPersonnes(listPersonnes) ptx.sauvegarderXml()
Fichier xml généré par l'application : carnet.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 > C:\tools\python2.2.1\python.exe -u "C:\Documents and Settings\g551918\Mes documents\MesProgrammesPython\testDom.py" <DOM Element: quil at 10405040> nom = Durant nom = Dupont ********************* Durant Stephan Bruxelles ********************* ********************* Dupont Henri None *********************
Resultat du parsing de carnet.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42<?xml version="1.0" ?> <quil> <personne> <nom> BROUARD </nom> <prenom> Bastien </prenom> <adresse> <ville> OSNY </ville> </adresse> </personne> <personne> <nom> LESAGE </nom> <prenom> Olivier </prenom> <adresse> <ville> CERGY </ville> </adresse> </personne> <personne> <nom> RICHARD </nom> <prenom> Yoan </prenom> <adresse> <ville> OSNY </ville> </adresse> </personne> </quil>
Cependant j'ai pu observé qu'en indentant manuellement le fichier carnet.xml comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 > C:\tools\python2.2.1\python.exe -u "C:\Documents and Settings\g551918\Mes documents\MesProgrammesPython\testDom.py" <DOM Element: quil at 10405272> nom = nom = nom = ********************* ********************* ********************* ********************* ********************* *********************
Le parsing fonctionneme parfaitement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24<?xml version="1.0" ?> <quil> <personne> <nom>BROUARD</nom> <prenom>Bastien</prenom> <adresse> <ville>OSNY</ville> </adresse> </personne> <personne> <nom>LESAGE</nom> <prenom>Olivier</prenom> <adresse> <ville>CERGY</ville> </adresse> </personne> <personne> <nom>RICHARD</nom> <prenom>Yoan</prenom> <adresse> <ville>OSNY</ville> </adresse> </personne> </quil>
Ma question est comment reussir à bien formatter le fichier xml en sortie ou bien faire en sorte que le parsing ne dépende pas du formatage ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 > C:\tools\python2.2.1\python.exe -u "C:\Documents and Settings\g551918\Mes documents\MesProgrammesPython\testDom.py" <DOM Element: quil at 10405336> nom = BROUARD nom = LESAGE nom = RICHARD ********************* BROUARD Bastien OSNY ********************* ********************* LESAGE Olivier CERGY ********************* ********************* RICHARD Yoan OSNY *********************
PS : il m'est interdit de passer à la version supérieure de python
Merci
Partager