2014-06-16 8 views
7

Ich arbeite mit einer riesigen XML-Datei und versuche, Informationen aus verschiedenen Elementen zu extrahieren.Übergeordnetes Element nach Verwendung der Methode find (xml.etree.ElementTree)

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

Um die Elemente ich find Methode zu finden:

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

Daraus ich Informationen zu extrahieren und zusätzlich Ich brauche Informationen aus dem übergeordneten Elemente. Aber elm.find('..') gibt nur None wie hier dokumentiert: https://docs.python.org/3/library/xml.etree.elementtree.html

Jetzt benutze ich die Folowing:

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

Das sieht ein bisschen unnatürlich für mich, aber funktioniert.

Kennen Sie einen besseren Weg, dies zu tun? Wissen Sie, warum nur None zurückgegeben wird?

Antwort

13

Die API xml.etree unterstützt nur eine eingeschränkte Version von XPath. Der xml.etree docs für den .. XPath Ausdrucksstatus:

Wählt das übergeordnete Element. Gibt keine zurück, wenn der Pfad versucht, die Vorfahren des Startelements zu erreichen (das Element find wurde genannt).

Das Elternelement direkt erhalten ist not supported in the xml.etree API. Ich würde daher empfehlen lxml zu verwenden, wo man einfach getparent() verwenden kann, das übergeordnete Element zu erhalten:

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

lxml hat auch eine volles XPath 1.0 implementation, so elem.xpath('..') würde auch funktionieren.

+0

thx !! komisch, dass die ursprünglich keinen getparent implementieren. – yoopoo

Verwandte Themen