2008-12-17 6 views
8

pour le xmlComment récupérer le nœud parent à l'aide de cElementTree?

<grandparent> 
    <parent1> 
    <child>data1</child> 
    </parent1> 
    <parent2> 
    <child>data2</child> 
    </parent2> 
</grandparent> 

J'ai besoin la liste contenant tuples des parents, des données pour chaque parent en XML.

Existe-t-il un moyen de le faire en utilisant cElementTree? Je suis capable de le faire pour l'enfant, les données, mais malheureusement l'enfant est identique dans toutes les valeurs, d'où il est de peu d'utilité.

Répondre

4

Il semble que vous puissiez accéder au parent de l'enfant en utilisant la version 1.3 de ElementTree (vérifiez http://effbot.org/zone/element-xpath.htm), en utilisant les commandes xpath telles que child.find('../parent'). Mais je pense que Python est livré avec la version 1.2 ou quelque chose.

Vous devriez également vérifier lxml qui est compatible avec etree et a soutien Xpath http://lxml.de/

+0

Le docs dit quelque chose comme «Modifié dans la version 2.7: L'API ElementTree est mis à jour à 1.3.' dans http: // docs .python.org/2/library/xml.etree.elementtree J'utilise 2.7 mais pour moi ''../myparent' 'ne semble toujours pas fonctionner; Qu'est-ce que ça veut dire? – n611x007

+0

Oui, je ne pense pas que ce soit un support dans cElementTree. par exemple: ET.fromstring (""). find ('.// ​​b'). find ('..') renvoie Aucun –

+1

@AndySmith Je pense que je sais pourquoi il n'en retourne aucune. Le [doc dit] (https://docs.python.org/3/library/xml.etree.elementtree.html#supported-xpath-syntax): 'Sélectionne l'élément parent. Renvoie None si le chemin tente d'atteindre les ancêtres de l'élément start (** l'élément find a été appelé **). ' – Adrian

5
parent_map = dict((c, p) for p in tree.getiterator() for c in p) 
parent_map[el].remove(el) 
+0

+1. parce que dans elementTree, l'accès au parent par '..' est cassé ou ne fonctionne pas ou d'une autre manière que je ne connais pas. Ainsi votre chemin le résoudra !!! on peut aussi le faire comme '{c: p pour p dans tree.getiterator() pour c dans p}' – namit

+0

@namit Je peux le confirmer. Je peux accéder correctement à mes nœuds mais quand je fais 'print ('parent =', el.findall (" ../ "))' qui est comment [ceci] (https://docs.python.org/3/library /xml.etree.elementtree.html#supported-xpath-syntax) dit ainsi, j'obtiens des objets nuls. – Adrian

+0

@namit s'avère que je n'ai pas lu correctement la documentation de '..':' Sélectionne l'élément parent. Renvoie None si le chemin tente d'atteindre les ancêtres de l'élément start (l'élément find a été appelé). [Link] (https://docs.python.org/3/library/xml.etree.elementtree.html# supported-xpath-syntax) – Adrian

0

Cette syntaxe semblait fonctionner pour cElementTree

ET.fromstring("<c><a><b></b></a></c>").find('.//b/..') 

pas d'aller au parent de base, et en utilisant double barre oblique puis barre oblique unique dans le chemin.
(aurait posté comme un commentaire au fil ci-dessus, mais il semble que je n'ai pas le privilège de)

Questions connexes