XML-Datei auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@yuyu: Ja lassen sie sich. Lies doch einfach mal die Dokumentation zum `ElementTree`-Modul. Die fängt mit einem Tutorial an.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@yuyu: findall() unterstützt auch XPath-Syntax. Das ist für komplexere Abfragen meist besser geeignet, anstatt den Baum händisch zu durchlaufen. Im schon erwähnten Tutorial findest du die entsprechende Stelle hier: https://docs.python.org/3/library/xml.e ... th-support
yuyu
User
Beiträge: 10
Registriert: Mittwoch 12. Dezember 2018, 21:07

Tutorial durchgegangen.

Folgendes Beispiel funktioniert am kleinen Beispiel, aber nicht am größerern Beispiel.

Code: Alles auswählen

import xml.etree.ElementTree as ET
tree = ET.parse('c:/input.xml')

for elem in tree.iter():
    if elem.tag == 'Name':
        print (elem.text)
    if elem.tag == 'Age':
        print (elem.text)
Ich habe ein Root mit vielen Unterstrukturen.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

yuyu hat geschrieben: Samstag 15. Dezember 2018, 18:17 Tutorial durchgegangen.
Wohl eher überflogen als durchgegangen in der kurzen Zeit...

Wie schon erwähnt sind komplexe Abfragen mit der XPath-Syntax möglich:

Code: Alles auswählen

# Alle Namen auf allen Ebenen
names = root.findall('.//Name')

# Alle Altersangaben auf allen Ebenen
ages = root.findall('.//Age')
Im Gegensatz zu deinem Ansatz werden hierbei nicht nur die direkten Kind-Elemente angeschaut, sondern auch die tiefer verschachtelten.

Findet sich beim Link aus meinem vorherigen Post in der Tabelle (Beschreibung in der vierten Spalte). Sofern man da mal reinschauen möchte...
yuyu
User
Beiträge: 10
Registriert: Mittwoch 12. Dezember 2018, 21:07

Hallo,
mit:

Code: Alles auswählen

import xml.etree.ElementTree as ET
tree = ET.parse('c:/data.xml')
root = tree.getroot()

names = root.findall('.//Name')
print (names)
bekomme ich und nicht den text vom tag:
[<Element 'Name' at 0x009116F0>, <Element 'Name' at 0x009117B0>, <Element 'Name' at 0x00911870>]

Wenn ich das gleiche auf das eigentliche XML loslasse, dann sehe ich nur zwei Zeiche in der Ausgabe: [ ]
yuyu
User
Beiträge: 10
Registriert: Mittwoch 12. Dezember 2018, 21:07

Beim Debuggen ist mir gerade aufgefallen, das Python für Tags mit Sonderzeichen (Minus), also z.B. Zeichen-Kette beides getrennt versucht zu lesen?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@yuyu: da hast Du wohl etwas falsch gemacht. Ohne aber endlich Dein richtiges XML und deinen richtigen Code zu kennen, kann man da schlecht helfen.
yuyu
User
Beiträge: 10
Registriert: Mittwoch 12. Dezember 2018, 21:07

Mein Problem lässt sich so zusammenfassen:
1. XML-Tag A suchen
2. Wenn A gefunden, dann XML-TAG Text von B und C ausgeben (falls vorhanden)
3. Wiederhole 1. solange bis Dateiende

Ehrlich weiss ich noch immer nicht, welche Funktion dafür am besten wäre
yuyu
User
Beiträge: 10
Registriert: Mittwoch 12. Dezember 2018, 21:07

ich vermute, dass folgendes vom Prinzip passen könnte, leider funktioniert das nur am kl. Beispiel bei mir.

import xml.etree.ElementTree as ET
tree = ET.parse('c:/test.xml')
root = tree.getroot()

for element in root.findall(".//animal"):
nick = element.find("Nick").text
print (nick)
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

yuyu hat geschrieben: Samstag 15. Dezember 2018, 23:39 ich vermute, dass folgendes vom Prinzip passen könnte, leider funktioniert das nur am kl. Beispiel bei mir.
Soll da jetzt eine geheime Frage enthalten sein...?

Wie gesagt: Ab diesem Punkt bringt nur noch der Original-Code etwas oder zumindest eine Struktur, die ihm sehr nahe kommt. Ansonsten musst du dich wohl selber durchhangeln. Die Grundlagen dürftest du ja nun drauf haben.
Antworten