ElementTree - findall rekursiv wählen Sie alle untergeordneten Elemente
Python-code:
import xml.etree.ElementTree as ET
root = ET.parse("h.xml")
print root.findall('saybye')
h.xml code:
<hello>
<saybye>
<saybye>
</saybye>
</saybye>
<saybye>
</saybye>
</hello>
Code gibt,
[<Element 'saybye' at 0x7fdbcbbec690>, <Element 'saybye' at 0x7fdbcbbec790>]
saybye
die ein Kind von einem anderen saybye
ist nicht hier ausgewählt. So, wie Sie anweisen, findall, um rekursiv zu Fuß nach unten den DOM-Baum und sammeln Sie alle drei saybye
Elemente?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zitieren
findall
,Da findet er nur die direkten Kinder, wir müssen rekursiv finden Sie andere Kinder, wie diese
Sogar noch besser, machen es zu einem generator-Funktion, wie dies
<saybye>
Knoten, die entweder direkte Kinder der Wurzel oder haben<saybye>
als Elternteil, weil Sie nicht durchqueren den ganzen Baum.Ab version 2.7 können Sie mit
xml.etree.ElementTree.Element.iter
:Sehen 19.7. xml.etree.ElementTree — Die ElementTree XML API
find()
,findall()
,findtext()
und sogariterfind()
optionalnamespaces
argument angeben, ein Wörterbuch mit namespaces. Nuriter()
nicht. Siehe: docs.python.org/3/library/...Wenn Sie nicht Angst vor ein wenig XPath, können Sie die
//
syntax, die Mittel zu finden, die alle descendant-Knoten:Volle XPath nicht unterstützt wird, aber hier ist die Liste dessen, was ist:
https://docs.python.org/2/library/xml.etree.elementtree.html#supported-xpath-syntax
müssen wir rekursiv Durchlaufen alle Kinder zu finden-Elemente, passend zu Ihrem element.