Ich verwende das integrierte Python ElementTree-Modul. Es ist einfach, auf Kinder zuzugreifen, aber was ist mit Eltern- oder Geschwisterknoten? - Kann dies effizient durchgeführt werden, ohne den gesamten Baum zu durchlaufen?Zugriff elementTree Knoten Elternknoten
Antwort
Es gibt keine direkte Unterstützung in Form eines parent
Attributs, aber Sie können vielleicht die beschriebenen Muster here verwenden, um den gewünschten Effekt zu erzielen. Der folgende Einzeiler wird vorgeschlagen (von der verlinkten zu schreiben), ein Kind zu Eltern-Mapping für einen ganzen Baum zu erstellen:
parent_map = dict((c, p) for p in tree.getiterator() for c in p)
Vinay's answer sollte immer noch funktionieren, aber für Python 2.7+ und 3.2+ der werden folgende Maßnahmen empfohlen:
parent_map = {c:p for p in tree.iter() for c in p}
getiterator()
für iter()
ist veraltet, und es ist schön, das neue dict
Liste Verständnis Konstruktor zu verwenden.
Zweitens, beim Erstellen eines XML-Dokuments ist es möglich, dass ein Kind mehrere Eltern hat, obwohl dies entfernt wird, sobald Sie das Dokument serialisieren. Wenn es ankommt, können Sie versuchen, diese:
parent_map = {}
for p in tree.iter():
for c in p:
if c in parent_map:
parent_map[c].append(p)
# Or raise, if you don't want to allow this.
else:
parent_map[c] = [p]
# Or parent_map[c] = p if you don't want to allow this
Was passiert, wenn Sie keinen Zugriff auf den Baum haben? Wie nach einer .find() – Brett
Ich kenne keine Möglichkeit, den Wurzelknoten (und damit Eltern/Vorfahren) zu erhalten, wenn Sie nicht einen Verweis darauf gespeichert haben. Aber ich verstehe nicht, wie '.find()' damit zu tun hat. – supergra
Ich habe '' find() 'als Beispielfunktion verwendet, die einfach ein Element zurückgibt – Brett
Eine andere Möglichkeit, wenn nur ein einzelnes Subelement der Eltern wollen und auch die Subelement XPath bekannt.
parentElement = subElement.find(xpath+"/..")
Funktioniert nicht für mich, ich bekomme 'None' - gleich, wenn ich nur' subElement.find ('..') 'benutze. – damian
Wenn Sie lxml verwenden, konnte ich das übergeordnete Element mit dem folgenden erhalten:
parent_node = next(child_node.iterancestors())
Dies wird zu erhöhen, um eine StopIteration
Ausnahme, wenn das Element Vorfahren nicht haben - so vorbereitet werden, um das zu fangen, wenn Sie in dieses Szenario kommen.
Sie können die Schreibweise xpath ...
in ElementTree verwenden.
<parent>
<child id="123">data1</child>
</parent>
xml.findall('.//child[@id="123"]...')
>> [<Element 'parent'>]
Dies ist eine fantastische Lösung, arbeitet mit find() auch wenn Sie wissen, dass es nur ein einzelnes Element, das Sie suchen, gibt. Wie folgt: 'root.find (" .//*[@testname = 'generated_sql'] ... ")' – Bostone
Wie in Get parent element after using find method (xml.etree.ElementTree) erwähnt würden Sie eine indirekte Suche nach Eltern zu tun haben. Mit xml:
<a>
<b>
<c>data</c>
<d>data</d>
</b>
</a>
Angenommen, Sie etree Element in xml
Variable erstellt haben, können Sie verwenden:
In[1] parent = xml.find('.//c/..')
In[2] child = parent.find('./c')
in Resultierende:
Out[1]: <Element 'b' at 0x00XXXXXX>
Out[2]: <Element 'c' at 0x00XXXXXX>
Höhere Eltern würden als zu finden: secondparent=xml.find('.//c/../..')
Sein <Element 'a' at 0x00XXXXXX>
Schauen Sie sich die 19.7.2.2 an. Sektion: Supported XPath syntax ...
Suche Knoten der Eltern mit dem Pfad:
parent_node = node.find('..')
Hast du das getestet? Wenn Sie es schaffen konnten, senden Sie bitte ein vollständiges Codebeispiel, das es demonstriert. Siehe diesen Kommentar: https://stackoverflow.com/questions/2170610/access-elementtree-node-parent-node#comment44519212_21963494 – mzjn
Die Python 3-Dokumentation sagt: "Gibt' None' zurück, wenn der Pfad versucht, die Vorfahren des Starts zu erreichen Element (das Element 'find' wurde aufgerufen)." (https://docs.python.org/3/library/xml.etree.elementtree.html#supported-xpath-syntax). – mzjn
Funktioniert für mich. Die beste und beste Antwort. – ToTenMilan
- 1. HTML innerhalb Knoten mit ElementTree
- 2. Warum benötigt removeChild einen Elternknoten?
- 3. Python ElementTree: ElementTree vs root Element
- 4. Wie XML-Knoten in Python hinzufügen ElementTree mit
- 5. Wie Elternknoten mit XQuery abrufen?
- 6. Alter Namespace mit ElementTree in Python
- 7. Wählen Elternknoten in verschachtelte Datensatz
- 8. Mit XPath in ElementTree
- 9. Elementtree und xsd Sequenzen
- 10. Python ElementTree Standard-Namespace?
- 11. ElementTree iterparse Strategie
- 12. Elementtree Einstellung Attribut Reihenfolge
- 13. XML-Parsing mit ElementTree
- 14. Ersten Elternknoten von JSON-Objekt mit JQuery
- 15. Zugriff remote mongodb von Knoten
- 16. Ansible passwortloser Zugriff zwischen Knoten
- 17. Mehrere Textknoten in Pythons ElementTree? HTML-Generierung
- 18. Iterating ElementTree in Python Django
- 19. Kompakter ElementTree oder Lxml Namespaces
- 20. Python ElementTree finden funktioniert nicht
- 21. Get Parser Fehlermeldung von ElementTree
- 22. ElementTree find() liefert immer keine
- 23. Cocos2d - mehrere Sprites auf Elternknoten nicht Schicht
- 24. C# ignorieren Elternknoten in Xml Deserialisierung
- 25. Parsing XML in Python mit ElementTree
- 26. Wie zu einem Elternknoten von einem Knoten in einer Baumansicht von Wijmo Flex Raster
- 27. erhalten Attributwert von XML-Kind-Knoten mit dem Zustand auf Elternknoten
- 28. Wie verwende ich XML :: XPath, um einen Elternknoten zu erhalten?
- 29. CSS-Klasse auf Elternknoten hinzufügen, wenn Kindknoten ausgewählt ist
- 30. Zugriff XML-Knoten in Parse-Zeichenfolge
Siehe http://stackoverflow.com/questions/374245/how-to-retrieve-the-parent-node-using- celementtree – kennytm