Seite 1 von 1
XML Datei einlesen mit Variablen und Werten
Verfasst: Donnerstag 19. Oktober 2017, 13:39
von rosi119
Moin Moin Leute,
ich habe eine Frage und ich glaube die Umsetzung ist relativ leicht, doch ich komme momentan nicht drauf
Ich habe eine XML-Datei, die vorher mal eine config Datei(.cfg) war. Diese XML-Datei möchte ich einlesen mit den Variablen und dem Wert dazu.
So das sie mir in Python zurverfügugn stehen.
Beispiel aus der XML Datei
Code: Alles auswählen
<BuildPath>Y:\Build\generate</BuildPath>
<RepoPath>X:\</RepoPath>
<ReleasePath>Y:\</ReleasePath>
<HwTemplate>lenovo-p300</HwTemplate>
Also das aus den <> möchte ich als Variable haben und den Wert als Variablen Wert.
Könnt ihr mir da helfen?
ist das schon der richtige Ansatz? from xml.etree import ElementTree
Bedanke mich schon mal für eure Hilfe.
Beste Grüße
Rosi119
Re: XML Datei einlesen mit Variablen und Werten
Verfasst: Donnerstag 19. Oktober 2017, 13:46
von Sirius3
@rosi119: ElementTree ist schonmal der richtige Ansatz. Jetzt mußt Du nur noch die Elemente durchgehen und Tag & Text in ein Wörterbuch speichern.
Re: XML Datei einlesen mit Variablen und Werten
Verfasst: Donnerstag 19. Oktober 2017, 13:57
von rosi119
okay besten Dank schon mal, für deine Hilfe. Dann weiß ich, dass das schon mal der richtige Weg ist jetzt mal schauen wie es weiter geht.
Re: XML Datei einlesen mit Variablen und Werten
Verfasst: Montag 23. Oktober 2017, 09:11
von rosi119
Code: Alles auswählen
import xml.etree.cElementTree as ET
tree = ET.ElementTree(file='config.xml')
root = tree.getroot()
for child_of_root in root:
Variablen = {child_of_root.tag: child_of_root.text}
print Variablen
Das hat schon mal geklappt, die Werte werden eingelsen.
Kann man einen Fehler erzeuge, wenn eine Variable in dem dict keinen Wert hat?
Dann soll ein Fehler ausgeben werden, in dem auch steht in welcher Zeile bzw Variable kein Wert steht.
Re: XML Datei einlesen mit Variablen und Werten
Verfasst: Montag 23. Oktober 2017, 09:34
von Sirius3
@rosi119: das hat schon mal nicht geklappt, weil Du `Variablen` immer wieder überschreibst. Was meinst Du mit "kein Wert"? Dass `child_of_root.text` leer ist? Das kannst Du ja einfach abprüfen.
Re: XML Datei einlesen mit Variablen und Werten
Verfasst: Montag 23. Oktober 2017, 09:46
von rosi119
ahh achso du hast recht.
akteull gibt print Variablen...
[('BuildPath', None)]
[('RepoPath', 'X:\\')]
[('ReleasePath', 'Y:\\')]
usw aus. Sind noch mehr einträge.
Und hier in der 1 Zeile ist es als Beispiel habe in der XML- Datei bei BuildPath den Wert entfernt, somit steht da None und wenn das passiert, dann möchte ich das er abbricht, da überall ein Wert stehen muss.
Edit:
Ah okay du meinst:
so? Als kleines Beispiel
Re: XML Datei einlesen mit Variablen und Werten
Verfasst: Dienstag 24. Oktober 2017, 06:47
von rosi119
Code: Alles auswählen
import xml.etree.cElementTree as ET
tree = ET.ElementTree(file='config.xml')
root = tree.getroot()
Variablen = {}
for child_of_root in root:
if child_of_root.text is None:
print('%s Wert fehlt!!!') % child_of_root.tag
break
else:
#print child_of_root.tag + " : " + child_of_root.text
Variablen.update({child_of_root.tag: child_of_root.text})
So hier einmal der funktionierende Code, falls noch jemand ähnliche Probleme hat.
Re: XML Datei einlesen mit Variablen und Werten
Verfasst: Dienstag 24. Oktober 2017, 07:21
von Sirius3
@rosi119: Deine Fehlerbehandlung ist nicht sehr sinnvoll. Du mußt Dich fragen, was passieren soll, wenn solch ein leerer Wert auftritt. Im Moment brichtst Du die Schleife ab und machst weiter als ob nichts gewesen wäre.
Zum Code: Variablennamen schreibt man generell klein. Ist es wichtig dass child_of_root ein Kind von der Wurzel ist, oder ist es nur irgendein Element? `print` ist keine Funktion, sollte also mit den Klammern auch nicht so geschrieben werden, vor allem, weil das ja gar nicht das Argument ist, sondern noch mit dem %-Operator verarbeitet wird. Der else-Block ist kaputt, weil jeder Block mindestens eine Anweisung enthalten muß. `update` ist die falsche Methode, um EIN Element eines Wörterbuchs zu setzen. Dafür gibt es Index-Zuweisung.
Code: Alles auswählen
import xml.etree.cElementTree as et
tree = et.ElementTree(file='config.xml')
variablen = {}
for element in tree.getroot():
if not element.text:
mach_eine_sinnvolle_fehlerbehandlung()
# print '%s: Wert fehlt!!!' % element.tag
variablen[element.tag] = element.text
Re: XML Datei einlesen mit Variablen und Werten
Verfasst: Dienstag 24. Oktober 2017, 13:04
von rosi119
Es soll auch weiter nichts passieren, man soll anschließend selber etwas in der XML-Datei verbessern.
Der Else-Block war nur auskommentiert. In dem Else-Block möchte ich jetzt bestimmte Strukturen überpüfen mit Regular expression.
Code: Alles auswählen
import xml.etree.cElementTree as ET
tree = ET.ElementTree(file='config.xml')
variablen = {}
for element in tree.getroot():
if not element.text:
print('%s Wert fehlt!!!') % element.tag
break
else:
variablen[element.tag] = element.text
print variablen
So meintest du das oder? Damit der erste Teil des Codes korrekt ist.
und jetzt muss ich den else Teil noch anpassen das er Strukturen von bestimmten Variablen überprüft.
Re: XML Datei einlesen mit Variablen und Werten
Verfasst: Dienstag 24. Oktober 2017, 13:42
von Sirius3
`print` ist keine Funktion, sollte also mit den Klammern auch nicht so geschrieben werden, vor allem, weil das ja gar nicht das Argument ist, sondern noch mit dem %-Operator verarbeitet wird. Wenn (noch) kein else-Block existiert, schreibt man auch kein `else`. So wie jetzt sind die Einrückungen noch kaputter als vorher. Wenn ein Fehler gefunden wird, dann wird normalerweise eine Exception geworfen, die vom übergeordneten Programm an der Stelle abgefangen wird, wo eine sinnvolle Weiterverarbeitung trotz Fehlers möglich ist. Wenn es nicht sinnvoll ist, dann wird die Exception gar nicht abgefangen und das Programm beendet sich von alleine:
Code: Alles auswählen
import xml.etree.cElementTree as et
tree = et.ElementTree(file='config.xml')
variablen = {}
for element in tree.getroot():
if not element.text:
raise ValueError('%s: Wert fehlt! Bitte XML-Datei korrigieren.' % element.tag)
variablen[element.tag] = element.text
So macht die Fehlerprüfung aber auch keinen Sinn, weil wenn ein Tag komplett fehlt, dann gibt das keinen Fehler. Also macht es sinn, Einlesen und Vollständigkeitsprüfung zu trennen:
Code: Alles auswählen
import xml.etree.cElementTree as et
tree = et.ElementTree(file='config.xml')
variablen = {element.tag: element.text for element in tree.getroot() if element.text}
if "eintrag" not in variablen or not eintrag_valid(variablen["eintrag"]):
raise ValueError("Eintrag 'eintrag' nicht vorhanden oder fehlerhaft.")
Re: XML Datei einlesen mit Variablen und Werten
Verfasst: Dienstag 24. Oktober 2017, 13:57
von rosi119
okay super besten Dank schon mal Sirius

Re: XML Datei einlesen mit Variablen und Werten
Verfasst: Samstag 28. Oktober 2017, 18:56
von bb1898
Sirius3 hat geschrieben:`print` ist keine Funktion, sollte also mit den Klammern auch nicht so geschrieben werden, vor allem, weil das ja gar nicht das Argument ist, sondern noch mit dem %-Operator verarbeitet wird.
Moment. Wo in diesem Thread ist ersichtlich, dass rosi119 Python 2 benutzt? Ich finde darauf keinen Hinweis. Dass "% element.tag" noch mit in die Klammern gehört, ist eine andere Sache.
Re: XML Datei einlesen mit Variablen und Werten
Verfasst: Samstag 28. Oktober 2017, 19:05
von __deets__
Auskommentierte print statements die sicher mal funktioniert haben —> Python2