XML Datei erzeugen

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
juli01
User
Beiträge: 2
Registriert: Donnerstag 6. März 2014, 17:00

Hallo :)
Ich programmiere im Moment an eine kleinen Programm und ich bekomme meine Variablen per Tkinter Eingabefeld.
Diese Variablen (z.B. Zeit Abfrage, Teams Abfrage für ein Volleyball Turnierplaner) wollte ich jetzt als XML Datei speichern, damit ich sie später wieder aufrufen kann. Es soll ungefähr diese Form haben:

Code: Alles auswählen

<xml>

<Dateiname>
                  <zeit>
                           Variable
                  </zeit>
                  <teams>
                           Teamname 1
                           Teamname 2
                           usw.
                  </teams>
</Dateiname>
Leider habe ich kaum Ahnung von XML deshalb schreibe ich dies hier.
So etwas habe ich bereits:

Code: Alles auswählen

# Dokument erzeugen
global name
implement = xml.dom.getDOMImplementation()
doc = implement.createDocument(None, name, None)

# Child Element "Zeit"
elem = doc.createElement("Zeit")
elem.setAttribute("output", "yes")
text = doc.createTextNode(zeit)
elem.appendChild(text)

# Child Element "Teams"
elem = doc.createElement("Teams")
elem.setAttribute("output", "yes")
text = doc.createTextNode(team_name)
elem.appendChild(text)
Leider gibt mir dies Fehler aus... Bitte um Hilfe
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Muss es denn XML sein? Wenn Du JSON benutzen könntest, wäre das alles viel einfacher!

Deine XML-Struktur passt so hinten und vorne noch nicht! Unter dem Tag <teams> würde ich jetzt ein Tag <team> erwarten, welcher den Team-Namen beinhaltet. (Ob als Text-Knoten oder Attribut, darüber kann man nun vortrefflich streiten :-D )

Was bewirkt das Tag <Dateiname>? (Und wieso wird dieses groß geschrieben im Gegensatz zum Rest?)

Beim XML solltest Du DOM vergessen und stattdessen die ElementTree-API nutzen. In der Standard-Lib gibt es dazu eine fertige Bibliothek; wenn's mehr Funktionalität bedarf grif zum externen und exzellenten ``lxml``-Modul.

Und wenn Du einen Fehler bekommst, dann *nenn* ihn uns auch ;-) Dann müssen wir hier nicht raten!

Ich würde es ja mit JSON angehen :-)

Im übrigen wäre das Thema unter "Allgemeine Fragen" besser aufgehoben; Tk ist hier ja nur Kontext und nicht inhaltlich relevant ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
juli01
User
Beiträge: 2
Registriert: Donnerstag 6. März 2014, 17:00

Wie würdest du denn mit JSON arbeiten? Ich kenn mich mit dem Speichern von Dateien mit Python überhaupt nicht aus und ich benutze XML nur, weil meine Informatiklehrer es empfohlen haben. Es soll wohl relativ leicht sein, XML Dateien zu erstellen, speichern und dan wieder aufzurufen.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

juli01 hat geschrieben:Wie würdest du denn mit JSON arbeiten? Ich kenn mich mit dem Speichern von Dateien mit Python überhaupt nicht aus und ich benutze XML nur, weil meine Informatiklehrer es empfohlen haben.
Wenn du den Umgang mit Dateien nicht kennst, dann bist du wohl im Tutorial noch nicht an der entsprechenden Stelle vorbeigekommen: Reading and Writing Files. Die Daten, die du dann in die Datei schreibst bzw. daraus liest sind dann in JSON verpackt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wenn Deine Teams als Liste vorliegen, wäre die Erzeugung von JSON z.B. so einfach:

Code: Alles auswählen

from datetime import datetime
import json

teams = ["Anaheim Mighty Ducks", "Hamburger SV", "Pythoniacs"]

team_data = {
"time": str(datetime.now()),
"teams": teams
}

team_data

json.dumps(team_data)

> '{"time": "2014-05-09 12:10:55.221376", "teams": ["Anaheim Mighty Ducks", 
"Hamburger SV", "Pythoniacs"]}'
Das Laden geht genauso einfach:

Code: Alles auswählen

dumped_data = json.dumps(team_data)

# hier holen wir aus dem *String* wieder Python-Objekte:
loaded_data = json.loads(dumped_data)

loaded_data
> {'teams': ['Anaheim Mighty Ducks', 'Hamburger SV', 'Pythoniacs'],
 'time': '2014-05-09 12:10:55.221376'}

# wir können mal prüfen, ob die aus dem String geholten Daten mit den
# Originaldaten übereinstimmen:
loaded_data == team_data
> True
Da Du wirklich mit Dateien arbeiten willst, gibt es die ``dump`` und ``load``-Funktionen des ``json``-Moduls. Diese haben einen Parameter, bei dem Du das geöffnete Dateiobjekt übergeben kannst.

So einfach kann das also sein :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Erstmal willkommen im Forum ;)

Ich wuerde dir auch empfehlen von XML Abstand zu nehmen, wenn du das Format und den Umgang (der gewoehnungsbeduerftig ist) damit noch nicht kennst.

Der Umgang mit JSON ist dagegen sehr nahe an Python und die gespeicherten Dateien sehen auch aehnlich wie das aus was man in Python gewoehnt ist.
Antworten