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

ElementTree : comment cloner un element ?

4 réponses
Avatar
m.banaouas
bonjour,

dans le cadre de l'utilisateion du module ElementTree, j'ai eu besoin de cloner
un élément. N'ayant pas trouvé un tel outil, j'ai commencé à écrire la fonction
"CloneElment" suivante:

def CloneElment(fromElem, destRoot = None):
"""
fromElem est l'élément à cloner
destRoot est le parent du clone (nouvel élément obtenu par clonage); si None
alors le parent sera celui de l'élément à cloner.
L'opération de clonage est récursive afin de traiter toute la sous-arborescence
de l'élément à cloner.
"""
if destRoot == None:
fromRoot = ET.ElementTree(fromElem).getroot()
destRoot = fromRoot
destElem = destRoot.makeelement(fromElem.tag, fromElem.attrib)
destRoot.append(destElem)
destElem.text = fromElem.text
for e in fromElem.findall('*'):
CloneElement(e, destElem)
#
cette fonction marche bien uniquement dans le cas où le destRoot est fourni par
le contexte appelant.

Le problème concerne la détermination de l'élément parent d'un élément elem à
partir de lui-même, c.à.d à partir de ses methodes propres.
Pour ce faire, cette écriture "ET.ElementTree(fromElem).getroot()" s'est révélée
fausse car elle renvoie fromElem lui-même!

Pour l'instant, j'ai remédié à cela en transmettant le paramètre destRoot depuis
le contexte appelant. Mais si qqun a une piste, je suis preneur ...

Merci d'avance

4 réponses

Avatar
moky
m.banaouas ha scritto:

bonjour,

dans le cadre de l'utilisateion du module ElementTree, j'ai eu besoin de cloner
un élément. N'ayant pas trouvé un tel outil, j'ai commencé à écrire la fonction
"CloneElment" suivante:



La fonction copy.deepcopy() sert à ça, je crois. Ca copie un objet, par
véritable copie, et non par assignation comme d'habitude.


Laurent
Avatar
m.banaouas
ok pour copy.deepcopy(), je vais regarder ...

mais il semble qu'il ne soit pas possible de déterminer l'element parent d'un
element en interrogeant element lui-même, alors que nous disposons de moyens
pour déterminer les elements fils de tout element.

moky a écrit :
m.banaouas ha scritto:

bonjour,

dans le cadre de l'utilisateion du module ElementTree, j'ai eu besoin
de cloner
un élément. N'ayant pas trouvé un tel outil, j'ai commencé à écrire
la fonction
"CloneElment" suivante:



La fonction copy.deepcopy() sert à ça, je crois. Ca copie un objet, par
véritable copie, et non par assignation comme d'habitude.


Laurent


Avatar
Fred Pacquier
"m.banaouas" said :

ok pour copy.deepcopy(), je vais regarder ...

mais il semble qu'il ne soit pas possible de déterminer l'element
parent d'un element en interrogeant element lui-même, alors que nous
disposons de moyens pour déterminer les elements fils de tout element.



BeautifulSoup est plus pratique pour ce genre de chose alors.
Avatar
olive
On Feb 2, 4:40 pm, "m.banaouas" wrote:
ok pour copy.deepcopy(), je vais regarder ...

mais il semble qu'il ne soit pas possible de déterminer l'element paren t d'un
element en interrogeant element lui-même, alors que nous disposons de m oyens
pour déterminer les elements fils de tout element.



Je te conseil LXML qui est conforme à l'API de ET mais qui apporte
beaucoup plus de choses, dont l'accès au parent.