Überprüfen Sie, ob das XML-Element Kinder hat oder nicht, in ElementTree
Ich das abrufen einer XML-Dokumente auf diese Weise:
import xml.etree.ElementTree as ET
root = ET.parse(urllib2.urlopen(url))
for child in root.findall("item"):
a1 = child[0].text # ok
a2 = child[1].text # ok
a3 = child[2].text # ok
a4 = child[3].text # BOOM
# ...
Des XML sieht wie folgt aus:
<item>
<a1>value1</a1>
<a2>value2</a2>
<a3>value3</a3>
<a4>
<a11>value222</a11>
<a22>value22</a22>
</a4>
</item>
Wie kann ich überprüfen, ob a4
(in diesem speziellen Fall, aber es könnte haben schon ein anderes element) hat Kinder?
InformationsquelleAutor | 2014-09-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie versuchen, die
list
Funktion auf das element:Ich geändert Probe, weil die
findall
Funktion rufen Sie auf deritem
root hat nicht funktioniert (wiefindall
suchen zur direkten Nachkommen, und nicht das aktuelle element). Wenn Sie möchten, um Zugriff auf den text gewährt von der subchildren danach in Ihrer Arbeit das Programm, das Sie tun konnte:Wäre dies eine gute Passform für eine rekursive obwohl.
es funktioniert nicht, weil dein iteration der Schleife liefert keine Elemente, da es keine Elemente mit dem Namen 'Element'
ja, es führt Sie in meiner realen Anwendung.
wie bekomme ich "<a11>" und "<a22>" - Elemente?
Es funktioniert, prüfen Sie diese pythonfiddle: pythonfiddle.com/check-if-element-has-children-or-not Anderes mir sagen, was genau nicht funktioniert. Ihr Beispiel hat nicht funktioniert, obwohl, damit, warum ich es geändert. Lassen Sie mich ändern, meine Antwort zu erklären, wie Sie den Zugriff auf die subchildren.
InformationsquelleAutor jlr
Die einfachste Weise, die ich nicht in der Lage zu finden, ist die Verwendung der
bool
Wert des Elements direkt. Dies bedeutet, dass Sie verwenden könnena4
in eine bedingte Anweisung ist:Dieser code ausgeführt wird drucken
Den boolean-Wert eines Elements nicht sagen nichts über
text
,tail
oder Attribute. Es zeigt nur die Anwesenheit oder Abwesenheit von Kindern, die, was die ursprüngliche Frage war gefragt.InformationsquelleAutor Mad Physicist
Die element-Klasse hat die Kinder-Methode. Also Sie sollten so etwas wie dieses, um zu überprüfen, ob Kinder da sind und speichert das Ergebnis in ein Wörterbuch von Schlüssel=tag-name:
getchildren
ist veraltet, wenn seit version 2.7. Dokumentation: list(elem) oder iteration.du hast Recht. Es sollte nicht mehr verwendet werden
InformationsquelleAutor marscher
Ich würde persönlich empfehlen, dass Sie verwenden einen xml-parser, voll unterstützt xpath-Ausdrücke. Die Teilmenge unterstützt von
xml.etree
ist unzureichend für Aufgaben wie diese.Beispielsweise in
lxml
ich tun kann:"gib mir alle Kinder der Kinder der
<item>
Knoten":oder,
"gib mir all
<item>
's Kinder, die haben keine Kinder, die sich selbst":oder,
"gib mir ALLE Elemente, die haben keine Kinder":
Leistung ist eine Sache,, ja, aber volle xpath-Unterstützung bedeutet, dass Sie tun all die Arbeit, das auswählen von Knoten in einem kompakten Ort. xpath-Abfragen, die mir ein paar Sekunden, um zu schreiben; schreiben von python-code zum Durchlaufen der Struktur und wählen Sie den Knoten I wollen, dauert länger und ist viel likelier zu generieren bugs. Es gibt viele andere Leistungen als die Leistung.
InformationsquelleAutor roippi
Können Sie die iter-Methode
InformationsquelleAutor David Córdoba Ruiz