2008-12-17 7 views
8

für die xmlWie kann der Elternknoten mit cElementTree abgerufen werden?

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

Ich brauche die Liste Tupel von Eltern, Daten für jeden Elternteil in XML enthalten.

Gibt es eine Möglichkeit, es mit cElementTree zu tun? Ich bin in der Lage, es für Kind, Daten zu tun, aber unglücklicherweise ist Kind in allen Werten identisch, folglich ist es von wenig Nutzen.

Antwort

4

Es scheint, dass Sie Zugriff auf das übergeordnete Element aus dem unter Verwendung der Version 1.3 von ElementTree (überprüfen http://effbot.org/zone/element-xpath.htm) zugreifen können, indem Xpath-Befehle wie child.find('../parent') verwenden. Aber ich denke, Python wird mit Version 1.2 oder etwas geliefert.

Sie auch für lxml überprüfen sollten, die mit etree kompatibel ist und hat die volle Unterstützung von XPath http://lxml.de/

+0

Die Dokumentation sagt etwas wie 'Geändert in Version 2.7: Die ElementTree API ist auf 1.3.' in http: // docs aktualisiert .python.org/2/library/xml.etree.elementtree Ich benutze 2,7, aber für mich scheint '../ myparent' immer noch nicht zu funktionieren; was bedeutet das? – n611x007

+0

Ja, ich denke nicht, dass dies in cElementTree unterstützt wird. Beispiel: ET.fromstring ("") .find ('.// ​​b'). find ('..') gibt keine zurück –

+1

@AndySmith Ich denke, ich weiß, warum es keine gibt. Das [docreases] (https://docs.python.org/3/library/xml.etree.elementtree.html#supported-xpath-syntax): 'Wählt das übergeordnete Element aus. Gibt None zurück, wenn der Pfad versucht, die Vorfahren des Startelements zu erreichen (** das Element find wurde aufgerufen **). ' – Adrian

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

+1. weil in elementTree der Zugriff auf Eltern durch '..' unterbrochen ist oder nicht funktioniert oder auf eine andere Weise, die ich nicht kenne.so wird dein Weg es lösen !!! wir können es auch tun als '{c: p für p in tree.getiterator() für c in p}' – namit

+0

@namit kann ich das bestätigen. Ich kann korrekt auf meine Knoten zugreifen, aber wenn ich 'print ('parent =', el.findall (" ../ "))' mache, wie [dies] (https://docs.python.org/3/library /xml.etree.elementtree.html#supported-xpath-syntax) sagte ich, ich bekomme null Objekte. – Adrian

+0

@namit stellt fest, dass ich die Dokumentation für '..' nicht richtig gelesen habe:' Wählt das übergeordnete Element aus. Gibt None zurück, wenn der Pfad versucht, die Vorfahren des Startelements zu erreichen (das Element find wurde aufgerufen). "[Link] (https://docs.python.org/3/library/xml.etree.elementtree.html# unterstützte-xpath-Syntax) – Adrian

0

Diese Syntax für celementtree

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

Keine gehen Basis Eltern, schien zu funktionieren und mit doppelter Schrägstrich dann single Schrägstrich im Pfad.
(hätte als Kommentar zu oben Thread geschrieben, aber es scheint, ich habe kein Privileg zu)

Verwandte Themen