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 :
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()
et la sortie que j'ai après avoir lancé le scrip et si le fichier essai.xml existe...
StdErr: Calling appendChild() on a null node does nothing.
Quelqu'un pourrait-il m'aiguiller sur ce problème.

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()