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

Le
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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
JB
Le #663358
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

Alain BARTHE
Le #663357
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...


JB
Le #663356
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()



Alain BARTHE
Le #663117
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.




Alain BARTHE
Le #663116
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.






Alain BARTHE
Le #663115
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()

JB
Le #663114

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.

Publicité
Poster une réponse
Anonyme