Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Modifier le nom d'un noeud XML avec xml.dom.minidom

7 réponses
Avatar
Alain BARTHE
Bonjour,

Je voudrais faire une sorte de convertisseur de fichiers xml en
utilisant l'api xml.dom.minidom

J'aimerais changer dans une serie de fichiers xml le nom des noeuds
racine de <project> en <mission>.


Voici le debut de mon code :

from xml.dom.minidom import parse
from xml.xpath import Evaluate

def convertir (file):

doc = parse (file)
node = Evaluate ("/project", doc) [0]

# a completer

print doc.toxml ()

Exemple de fichier :

<project id = "CLUSTER" name = "Projet Cluster ESA">

<mission-time-span start = "2000-08-21" />

<observatories>

<observatory id = "C1" name = "Cluster 1">
<instruments>
<instrument id = "CIS-CODIF"/>
<instrument id = "CIS-HIA"/>
<instrument id = "CIS-HSK"/>
<instrument id = "FGM"/>
</instruments>
</observatory>

</project>


Questions :
Existe t'il dans l'api DOM un moyen de renommer un noeud ?

Sinon, faut-il que j'en cree un nouveau, y recopie le contenu de
l'ancien, puis supprime l'ancien ?

Je peux aussi faire ca avec un editeur de texte de type sed, ou avec des
regex python, mais je suis en train de me familiariser avec xml et
j'aurais aimé faire ça le plus proprement possible.

Il doit également être possible de le faire avec l'API Sax mais je
préfèrerai m'en tenir à DOM pour l'instant.

Merci d'avance pour votre aide.

7 réponses

Avatar
JB
J'aimerais changer dans une serie de fichiers xml le nom des noeuds
racine de <project> en <mission>.

from xml.dom.minidom import parse
from xml.xpath import Evaluate

def convertir (file):

doc = parse (file)
node = Evaluate ("/project", doc) [0]


print doc.documentElement.nodeName # renvoie project
doc.documentElement.nodeName = "mission" ?

a tester

Sinon, faut-il que j'en cree un nouveau, y recopie le contenu de
l'ancien, puis supprime l'ancien ?


oui tu peux aussi faire ca si ca marche pas...

++

ju

Avatar
Alain BARTHE
J'aimerais changer dans une serie de fichiers xml le nom des noeuds
racine de <project> en <mission>.

from xml.dom.minidom import parse
from xml.xpath import Evaluate

def convertir (file):

doc = parse (file)
node = Evaluate ("/project", doc) [0]


print doc.documentElement.nodeName # renvoie project
doc.documentElement.nodeName = "mission" ?

a tester

Ca n'a pas l'air de marcher.

Dommage, c'était vraiment trop simple.

Sinon, faut-il que j'en cree un nouveau, y recopie le contenu de
l'ancien, puis supprime l'ancien ?


oui tu peux aussi faire ca si ca marche pas...

++

ju


Je vais essayer...


Avatar
JB
Ca n'a pas l'air de marcher.
Dommage, c'était vraiment trop simple.


effectivement, je suis aussi decu que vous...

Sinon, faut-il que j'en cree un nouveau, y recopie le contenu de
l'ancien, puis supprime l'ancien ?




une proposition :

from xml.dom.minidom import parseString

d = parseString("<noeud><fils id='1'/><fils id='2'/><fils
id='3'><sousfils/></fils></noeud>")
e = parseString("<noeudtest/>")

while (d.documentElement.childNodes.length > 0):
e.documentElement.appendChild(d.documentElement.firstChild)

print e.toxml()



Avatar
Alain BARTHE
Ca n'a pas l'air de marcher.
Dommage, c'était vraiment trop simple.


effectivement, je suis aussi decu que vous...

Sinon, faut-il que j'en cree un nouveau, y recopie le contenu de
l'ancien, puis supprime l'ancien ?




une proposition :

from xml.dom.minidom import parseString

d = parseString("<noeud><fils id='1'/><fils id='2'/><fils
id='3'><sousfils/></fils></noeud>")
e = parseString("<noeudtest/>")

while (d.documentElement.childNodes.length > 0):
e.documentElement.appendChild(d.documentElement.firstChild)

print e.toxml()


Ca devrait marcher, il faut juste que j'ajoute les attributs du noeud
initial au noeud e. Je testerai ça cet après-midi.

Par contre, c'est un peu lourd.
Je vais essayer de trouver une solution plus élégante, et le ferai
savoir si j'y arrive.

Merci encore pour votre aide.




Avatar
Alain BARTHE
J'ai fini par trouver la solution :

doc = parse (file)

doc.documentElement.tagName = "xxx"

print doc.toxml()

Il suffisait d'affecter tagName au lieu de nodeName.

Je n'ai pas bien saisi la différence entre les deux mais ça marche.

Peut-être que nodeName est un attribut en lecture seule et que tagName
l'est en lecture/écriture.

En tout cas merci.




Ca n'a pas l'air de marcher.
Dommage, c'était vraiment trop simple.


effectivement, je suis aussi decu que vous...

Sinon, faut-il que j'en cree un nouveau, y recopie le contenu de
l'ancien, puis supprime l'ancien ?




une proposition :

from xml.dom.minidom import parseString

d = parseString("<noeud><fils id='1'/><fils id='2'/><fils
id='3'><sousfils/></fils></noeud>")
e = parseString("<noeudtest/>")

while (d.documentElement.childNodes.length > 0):
e.documentElement.appendChild(d.documentElement.firstChild)

print e.toxml()


Ca devrait marcher, il faut juste que j'ajoute les attributs du noeud
initial au noeud e. Je testerai ça cet après-midi.

Par contre, c'est un peu lourd.
Je vais essayer de trouver une solution plus élégante, et le ferai
savoir si j'y arrive.

Merci encore pour votre aide.






Avatar
Alain BARTHE
Bonjour,

Je voudrais faire une sorte de convertisseur de fichiers xml en
utilisant l'api xml.dom.minidom

J'aimerais changer dans une serie de fichiers xml le nom des noeuds
racine de <project> en <mission>.


Voici le debut de mon code :

from xml.dom.minidom import parse
from xml.xpath import Evaluate

def convertir (file):

doc = parse (file)
node = Evaluate ("/project", doc) [0]

# a completer

print doc.toxml ()

Exemple de fichier :

<project id = "CLUSTER" name = "Projet Cluster ESA">

<mission-time-span start = "2000-08-21" />

<observatories>

<observatory id = "C1" name = "Cluster 1">
<instruments>
<instrument id = "CIS-CODIF"/>
<instrument id = "CIS-HIA"/>
<instrument id = "CIS-HSK"/>
<instrument id = "FGM"/>
</instruments>
</observatory>

</project>


Questions :
Existe t'il dans l'api DOM un moyen de renommer un noeud ?

Sinon, faut-il que j'en cree un nouveau, y recopie le contenu de
l'ancien, puis supprime l'ancien ?

Je peux aussi faire ca avec un editeur de texte de type sed, ou avec des
regex python, mais je suis en train de me familiariser avec xml et
j'aurais aimé faire ça le plus proprement possible.

Il doit également être possible de le faire avec l'API Sax mais je
préfèrerai m'en tenir à DOM pour l'instant.

Merci d'avance pour votre aide.


Autre solution :

from xml.dom.minidom import parse
from xml.xpath import Evaluate

def convertir (filename):
doc = parse (filename)

# recherche du noeud a modifier
node = Evaluate ("/project", doc) [0]

doc.renameNode (node, None, "mission")

print doc.toxml()

Avatar
JB

doc = parse (file)
doc.documentElement.tagName = "xxx"
print doc.toxml()

Il suffisait d'affecter tagName au lieu de nodeName.
Je n'ai pas bien saisi la différence entre les deux mais ça marche.
Peut-être que nodeName est un attribut en lecture seule et que tagName
l'est en lecture/écriture.


Youhou genial, MERCI !

ca peut servir ;)

Bonne fetes a tous !!

julien.