Seite 1 von 1
XML erstellen in Schleife
Verfasst: Montag 8. Februar 2021, 14:49
von woehrer
Ich möchte in einer Schleife Daten sammeln und anschließend in ein Array schreiben.
Es werden Daten abgerufen. (Der Teil funktioniert) und anschließend sollen diese noch in der Schleife in die XML geschrieben werden.
Leider kommt im XML nichts an.
Was mache ich denn falsch?
Ich habe bewusst ein paar Codeteile weggelassen, da diese mit dem eigentlichen Problem nichts zu tun haben und es sonst den Post sprengen würde.
Code: Alles auswählen
#XML Felder deklarieren
b1 = []
b2 = []
b3 = []
b4 = []
b5 = []
...
i = 0
dhoehe = hoehemin
while dhoehe <=hoehemax:
...(Datenabruf)
m1 = gfg.Element("Data")
root.append (m1)
b1.append(".")
b1[i] = gfg.SubElement(m1, "Lat")
b1[i].text = str(dlat)
b2.append(".")
b2[i] = gfg.SubElement(m1, "Lon")
b2[i].text = str(dlon)
b3.append(".")
b3[i] = gfg.SubElement(m1, "Hoehe")
b3[i].text = str(dhoehe)
b4.append(".")
b4[i] = gfg.SubElement(m1, "Geschwindigkeit")
b4[i].text = str(dhoehe)
b5.append(".")
b5[i] = gfg.SubElement(m1, "Richtung")
b5[i].text = str(dhoehe)
i = i + 1
....
tree = gfg.ElementTree(root)
with open ("XML/Wind.xml", "wb") as files :
tree.write(files)
Re: XML erstellen in Schleife
Verfasst: Montag 8. Februar 2021, 15:15
von Sirius3
Was ist denn gfg? Das ist nirgends definiert.
Da in der while-Schleife werde dhoehe noch hoehemax geändert werden, ist das eine Endlosschleife.
`m1` ist ein äußerst schlecher Name, für ein data-Element.
Was der Sinn von b1 bis b5. Das sind auch alles schlechte Namen für eine Liste mit Höhen oder Richtungen.
Dieses append und der Indexzugriff ist doch auch äußerst umständlich. Listen füllt man ausschließlich mit append.
Aber wie schon geschrieben, die Listen sind unnötig.
Warum fangen alle anderen Variablen mit d an? Benutze keine kryptischen Abkürzungen oder unsinnige Anhängsel.
Bleibt also
Code: Alles auswählen
dhoehe = hoehemin
while dhoehe <=hoehemax:
data_element = gfg.SubElement(root, "Data")
gfg.SubElement(data_element, "Lat").text = str(dlat)
gfg.SubElement(data_element, "Lon").text = str(dlon)
gfg.SubElement(data_element, "Hoehe").text = str(dhoehe)
gfg.SubElement(data_element, "Geschwindigkeit").text = str(dhoehe)
gfg.SubElement(data_element, "Richtung").text = str(dhoehe)
tree = gfg.ElementTree(root)
with open("XML/Wind.xml", "wb") as output:
tree.write(output)
Warum glaubst Du, dass die while-Schleife überhaupt durchlaufen wird?
Re: XML erstellen in Schleife
Verfasst: Montag 8. Februar 2021, 15:34
von __blackjack__
@woehrer: Der erste Fehler ist Listen `b1` bis `b5` zu nennen. Namen sollen dem Leser verraten was der Wert dahinter bedeutet. Einbuchstabige, nummerierte Namen tun das ganz sicher nicht. Nummerieren sollte man Namen auch nicht. Da will man entweder bessere Namen verwenden, oder gar keine Einzelnamen/-werte sondern eine Datenstruktur. Oft eine Liste, manchmal auch ein Tupel, wenn's länger wird gerne auch ein `collections.namedtuple`, oder gar eine eigene Klasse.
Im Beitrag steht was von Array, im Code ist davon nichts zu sehen. Falls damit Listen gemeint sind: bitte auch Listen nennen, denn es gibt auch Arrays und das ist potentiell verwirrend die Begriffe durcheinander zu bringen.
Die ``while``-Schleife ist eigentlich eine ``for``-Schleife. Und `i` braucht man nicht wirklich, denn an eine Liste erst einen völlig unsinnigen Punkt anzuhängen und den dann sofort durch ein XML-Element zu ersetzen ist ziemlich Banane. Da hängt man einfach gleich das XML-Element an die Liste an und schon braucht man den Punkt nicht mehr und auch das `i` nicht. Letztlich braucht man diese Listen auch überhaupt gar nicht.
`gfg` ist eine komische Abkürzung. Warum heisst das Modul aus dem die ElementTree-API kommt *so*?
`files` ist ein falscher Namen für *eine* Datei.
Bleibt das hier übrig:
Code: Alles auswählen
...
for dhoehe in range(hoehemin, hoehemax + 1):
... # (Datenabruf)
data_node = gfg.Element("Data")
root.append(data_node)
for element_name, value in zip(
["Lat", "Lon", "Hoehe", "Geschwindigkeit", "Richtung"],
[dlat, dlon, dhoehe, dhoehe, dhoehe],
):
gfg.SubElement(data_node, element_name).text = str(value)
...
with open("XML/Wind.xml", "wb") as file:
gfg.ElementTree(root).write(file)
Warum Dein Code, oder der hier, keine Daten schreibt kann man aus dem Code nicht erkennen. Schreibt der gar nichts oder sind da nur keine Daten im `root`-Element?
Re: XML erstellen in Schleife
Verfasst: Montag 8. Februar 2021, 15:37
von woehrer
Ich glaube nicht ich weiß.
Die Schleife funktioniert schon lange und tut auch weiterhin ihren Job
Hier geht es bitte auch nicht um namensgebung.
gfg ist definiert mit:
import xml.etree.ElementTree as gfg
Leider funktioniert auch dein Teil den du geschickt hast nicht.
in der XML steht nur <Wind/>
Re: XML erstellen in Schleife
Verfasst: Montag 8. Februar 2021, 15:56
von __blackjack__
@woehrer: Dann wird die Schleife nicht durchlaufen, oder zumindest nicht der Code der die Elemente erzeugt, also in den ... für den Datenabruf passiert etwas was wir nicht kennen. Oder in den ... vor dem schreiben der Datei passiert etwas was wir nicht kennen.
Wenn Du Code öffentlich zeigst, und andere Leute fragst wo da der Fehler sein könnte, geht es auch um Namensgebung. Denn wir müssen den Code ja schliesslich lesen. Und wenn der nicht leicht lesbar ist, dann übersehen wir potentiell auch Fehler oder man hat erst gar keine Lust sich das durchzulesen.
Wie `gfg` definiert ist, hatte ich mir fast gedacht. Mir ist immer noch schleierhaft warum das `gfg` heisst. Die beiden gängigen Varianten sind ``import xml.etree.ElementTree as etree`` oder ``import xml.etree.ElementTree as ET`` (oder man verwendet das externe `lxml.etree` statt `xml.etree.ElementTree`). Da ist mir auch klar wie die Abkürzung zustandekommt. Aber `gfg`‽
Re: XML erstellen in Schleife
Verfasst: Montag 8. Februar 2021, 17:58
von woehrer
Ich habe in der Schleife Print Ausgaben die mir jeweils eine Variable ausgeben und diese Variablen kann ich in der Konsole lesen.
reicht das als Beweis?
Re: XML erstellen in Schleife
Verfasst: Montag 8. Februar 2021, 18:22
von Sirius3
Du brauchst uns nichts beweisen. Wir sagen, das in dem Teil des Codes, den Du uns zeigst, kein Fehler ist. Wenn du nicht die relevanten Stellen des Codes zeigen möchtest, dann können wir dir halt nicht helfen. Deine Entscheidung.
Re: XML erstellen in Schleife
Verfasst: Montag 8. Februar 2021, 18:28
von woehrer
Welche Teile vom Code willst du denn sehen?
Wenn ich das weiß kann ich sie hier gerne posten
Re: XML erstellen in Schleife
Verfasst: Montag 8. Februar 2021, 18:38
von __blackjack__
@woehrer: Am besten den Teil wo der Fehler drin ist. Uns andere Teile zu zeigen ist nicht wirklich hilfreich.

Re: XML erstellen in Schleife
Verfasst: Montag 8. Februar 2021, 20:08
von woehrer
@Sirius Danke aber ich habe den Fehler in deinem Code gefunden.
Der Fehler war das : data_element = gfg.SubElement(root, "Data")
nach dem While zu machen.