XML Datei einlesen mit Variablen und Werten

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.
Antworten
rosi119
User
Beiträge: 19
Registriert: Donnerstag 5. Oktober 2017, 12:25

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@rosi119: ElementTree ist schonmal der richtige Ansatz. Jetzt mußt Du nur noch die Elemente durchgehen und Tag & Text in ein Wörterbuch speichern.
rosi119
User
Beiträge: 19
Registriert: Donnerstag 5. Oktober 2017, 12:25

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.
rosi119
User
Beiträge: 19
Registriert: Donnerstag 5. Oktober 2017, 12:25

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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
rosi119
User
Beiträge: 19
Registriert: Donnerstag 5. Oktober 2017, 12:25

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:

Code: Alles auswählen

    if child_of_root.text is None:
        print('Wert fehlt!')
so? Als kleines Beispiel
rosi119
User
Beiträge: 19
Registriert: Donnerstag 5. Oktober 2017, 12:25

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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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
rosi119
User
Beiträge: 19
Registriert: Donnerstag 5. Oktober 2017, 12:25

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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

`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.")
rosi119
User
Beiträge: 19
Registriert: Donnerstag 5. Oktober 2017, 12:25

okay super besten Dank schon mal Sirius :)
bb1898
User
Beiträge: 199
Registriert: Mittwoch 12. Juli 2006, 14:28

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.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Auskommentierte print statements die sicher mal funktioniert haben —> Python2
Antworten