Obtenir l'élément parent après avoir utilisé la méthode find (xml.programme etree.ElementTree)

je travaille avec un énorme fichier xml et j'essaie d'extraire des informations à partir de différents éléments.

import xml.etree.ElementTree as ET
tree = ET.parse('t.xml')
root = tree.getroot()

pour trouver les éléments j'utilise la méthode find:

elm = root.find('.//Element[@elmid="1234"]')

j'en extraire des informations et en plus j'ai besoin d'informations de l'élément parent. Mais elm.find('..') retourne seulement None comme documenté ici: https://docs.python.org/3/library/xml.etree.elementtree.html

maintenant j'utilise le folding:

prt = root.find('.//Element[@elmid="1234"]/..')     
elm = prt.find('/Element[@elmid="1234"]')

cela me semble un peu contre nature, mais ça marche.

connaissez-vous une meilleure façon de le faire? Savez-vous pourquoi seulement None est retourné?

7
demandé sur yoopoo 2014-06-16 12:29:38

1 réponses

L'API xml.etree ne supporte Qu'une version limitée de XPath. Le xml.etree docs pour l'expression .. XPath état:

sélectionne l'élément parent. ne renvoie aucun si le chemin tente de rejoindre les ancêtres de l'élément start (l'élément find a été appelé sur.)

obtenir directement l'élément parent est Non pris en charge dans le xml.etree API . Je recommande donc d'utiliser lxml , où vous pouvez simplement utiliser getparent() pour obtenir l'élément parent:

elm = root.find('.//Element[@elmid="1234"]')
elm.getparent()

lxml a aussi un XPath 1.0 implementation , donc elem.xpath('..') fonctionnerait aussi.

13
répondu Lukas Graf 2017-05-23 12:25:48