Bonsoir à tous,
Je m’exerce à la création de fichier XML avec le module QtXml.
J'aimerai pouvoir modifier un fichier XML existant et en particulier rajouter des éléments dans le l'élément principal (si j'ai bien saisi celui que l'on appelle communément l'élément root).
À la lecture de la doc, il me semblait que la méthode QtXml.QDomDocument.documentElement() permet de récupérer cet élément. Il me paraissait alors assez simple de faire ce que je souhaitais... mais que nini..
Voici mon code :
et la sortie que j'ai après avoir lancé le scrip et si le fichier essai.xml existe...
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 # -*- coding: utf-8 -*- from PyQt4 import QtXml, QtCore mode_w = QtCore.QIODevice.WriteOnly mode_a = QtCore.QIODevice.Append class UtilisationDom(): def __init__(self): self.doc = QtXml.QDomDocument() self.file = QtCore.QFile("files//essai.xml") self.out = QtCore.QTextStream(self.file) if self.file.exists(): self.file.open(mode_a) self.root = self.doc.documentElement() self.ajoutDom("ceci est le noeud 1 de l'entrée ", "ceci est le noeud 2 de l'entrée 2") else: self.file.open(mode_w) self.ecritureDom() self.ajoutDom("ceci est le noeud 1 de l'entrée 1", "ceci est le noeud 2 de l'entrée 1") self.validationDom() def ecritureDom(self): self.root = self.doc.createElement("ROOT") self.doc.appendChild(self.root) self.noeud = self.doc.createProcessingInstruction("xml","version=\"1.0\"") self.doc.insertBefore(self.noeud, self.doc.firstChild()) def ajoutDom(self, a, b): noeud0 = self.doc.createElement("noeud0") self.root.appendChild(noeud0) noeud0.setAttribute("attribut", 'toto') noeud1= self.doc.createElement("noeud1") noeud0.appendChild(noeud1) noeud2 = self.doc.createElement("noeud2") noeud0.appendChild(noeud2) txt1 = self.doc.createTextNode(a) noeud1.appendChild(txt1) txt2 = self.doc.createTextNode(b) noeud2.appendChild(txt2) def validationDom(self): self.doc.save(self.out, 2) self.file.close() app = UtilisationDom()
Quelqu'un pourrait-il m'aiguiller sur ce problème.StdErr: Calling appendChild() on a null node does nothing.
D'avance merci
[EDIT]
C'est bon j'ai trouvé la solution... Il faut en fait tout simplement lire le fichier avant... ben oui, c'est tout de même plus logique comme ça.
Pour ceux que ça intéresse, voici le code
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 # -*- coding: utf-8 -*- from PyQt4 import QtXml, QtCore mode_w = QtCore.QIODevice.WriteOnly mode_r = QtCore.QIODevice.ReadOnly class EcrireDom(): def __init__(self): self.file = QtCore.QFile("files//essai.xml") self.doc = QtXml.QDomDocument() self.out = QtCore.QTextStream(self.file) self.file.open(mode_w) self.root = self.doc.createElement("ROOT") self.doc.appendChild(self.root) self.noeud = self.doc.createProcessingInstruction("xml","version=\"1.0\"") self.doc.insertBefore(self.noeud, self.doc.firstChild()) self.ajoutDom("ceci est le noeud 1 de l'entrée 1", "ceci est le noeud 2 de l'entrée 1") self.validationDom() def ajoutDom(self, a, b): noeud0 = self.doc.createElement("noeud0") self.root.appendChild(noeud0) noeud0.setAttribute("attribut", '1') noeud1= self.doc.createElement("noeud1") noeud0.appendChild(noeud1) noeud2 = self.doc.createElement("noeud2") noeud0.appendChild(noeud2) txt1 = self.doc.createTextNode(a) noeud1.appendChild(txt1) txt2 = self.doc.createTextNode(b) noeud2.appendChild(txt2) def validationDom(self): self.doc.save(self.out, 2) self.file.close() class ModifDom(): def __init__(self): self.file = QtCore.QFile("files//essai.xml") self.file.open(mode_r) self.doc = QtXml.QDomDocument() self.doc.setContent(self.file) self.file.close() self.file.open(mode_w) self.out = QtCore.QTextStream(self.file) self.root = self.doc.documentElement() print (self.root.tagName()) self.ajoutDom("ceci est le noeud 1 de l'entrée 2", "ceci est le noeud 2 de l'entrée 2") self.validationDom() def ajoutDom(self, a, b): noeud0 = self.doc.createElement("noeud0") self.root.appendChild(noeud0) noeud0.setAttribute("attribut", '2') noeud1= self.doc.createElement("noeud1") noeud0.appendChild(noeud1) noeud2 = self.doc.createElement("noeud2") noeud0.appendChild(noeud2) txt1 = self.doc.createTextNode(a) noeud1.appendChild(txt1) txt2 = self.doc.createTextNode(b) noeud2.appendChild(txt2) def validationDom(self): self.doc.save(self.out, 2) self.file.close() if QtCore.QFile("files//essai.xml").exists() == False: app = EcrireDom() else: app = ModifDom()
Partager