XML erstellen in Schleife

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
woehrer
User
Beiträge: 8
Registriert: Montag 1. Februar 2021, 12:14

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) 


Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
woehrer
User
Beiträge: 8
Registriert: Montag 1. Februar 2021, 12:14

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/>
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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`‽
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
woehrer
User
Beiträge: 8
Registriert: Montag 1. Februar 2021, 12:14

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

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.
woehrer
User
Beiträge: 8
Registriert: Montag 1. Februar 2021, 12:14

Welche Teile vom Code willst du denn sehen?
Wenn ich das weiß kann ich sie hier gerne posten
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@woehrer: Am besten den Teil wo der Fehler drin ist. Uns andere Teile zu zeigen ist nicht wirklich hilfreich. 🙂
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
woehrer
User
Beiträge: 8
Registriert: Montag 1. Februar 2021, 12:14

@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.
Antworten