Absoluter Anfänger: XML-Datei einlesen

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
najus
User
Beiträge: 1
Registriert: Freitag 13. Mai 2022, 11:55

Hallo Forum-Mitglieder,

ich bin absoluter Neuling in Sachen Programmierung, möchte aber nichts desto trotz, eine Art "XML-Editor App" für eine Maschine programmieren.
Ich habe mich bisher in das ein oder andere durchgelesen (XML, Namespace, Elementree etc.) und versucht anhand von Beispielen, es für mich umzusetzen, aber vieles ist für mich nicht verständlich
Als erstes möchte ich die unten aufgelistete xml-Datei laden und in irgendeiner Form (komplette Werte / einzelne Werte) vorerst auf dem Bildschirm ausgeben.
Die XML sieht so aus und darf in ihrer Struktur auch nicht geändert werden:



<?xml version="1.0" encoding="utf-8"?>
<Database xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Cocktaibase>
<Bottles>
<Bottle name="Ananassaft" volume="750" fillLevel="735" position="6" image="Granini_Ananas.png" isActive="true" category="Juice">
<Calibration name="Ananas Cal" openingTime="9609" volume="100" />
</Bottle>
<Bottle name="Orangensaft" volume="1000" fillLevel="950" position="1" image="Granini_Orange.png" isActive="true" category="Juice">
<Calibration name="Orangensaft Cal" openingTime="8046" volume="100" />
</Bottle>
</Bottles>
<Cocktails>
<Cocktail name="Alice NA+" image="100_Alice.png" isFavorite="false" mix="Alice NA+" cocktailCounter="0">
<Preparation name="" text="Glas mit 4 Eiswürfel füllen + Sahne" />
</Cocktail>
<Cocktail name="Annabella NA" image="101_Annabella.png" isFavorite="false" mix="Annabella NA" cocktailCounter="0">
<Preparation name="" text="1/2 Glas Crushed Ice" />
</Cocktail>
</Cocktails>
<Mixes>
<Mix name="Alice NA+">
<MixStep name="Orangensaft" bottle="Orangensaft" volume="50" waitUntilDone="false" />
<MixStep name="Ananassaft" bottle="Ananassaft" volume="50" waitUntilDone="false" />
<MixStep name="Grenadine" bottle="Grenadine" volume="20" waitUntilDone="false" />
</Mix>
<Mix name="Annabella NA">
<MixStep name="Oragensaft" bottle="Orangensaft" volume="60" waitUntilDone="false" />
<MixStep name="Ananassaft" bottle="Ananassaft" volume="51" waitUntilDone="false" />
<MixStep name="Grenadine" bottle="Grenadine" volume="30" waitUntilDone="false" />
<MixStep name="Sahne" bottle="Sahne" volume="10" waitUntilDone="false" />
</Mix>
</Mixes>
<Settings>
<Setting name="isImagesOn" value="1" />
<Setting name="manualMenu" value="1" />
</Settings>
</Cocktailbase>
</Database>


Mein Hauptziel ist es, um es für euch auch verständlicher zu machen....ein grafische Oberfläche/ Programm zu erstellen, mit dem man die XML einliest, Flaschen einpflegen, löschen und ändern etc. kann. Das gleiche noch mit Cocktails und Mixe. Zudem soll eine Beziehung zwischen "Cocktail-Name" und "Mix-Name" stehen, sowie "bottle-name"und "Mixstep-bottle". Damit man dann im Programm, wenn man ein Cocktail aufruft, sieht welche Flaschen notwendig sind, wie sich der Cocktails aus wieviel und zusammen setzt usw. ……also im Endeffekt eine komfortable Editierbarkeit von einer Oberfläche aus..
So weit, so gut....ich weiß es wird ein langer Weg.........

Bisher hatte ich versucht, mit diesen Zeilen etwas aus der XML zu entlocken und bekomme bis jetzt nur die Tag’s angezeigt:


import xml.etree.ElementTree as ET
tree = ET.parse('database.xml')
root = tree.getroot()

for x in root.findall('.//Bottle'):
print(x.tag)

Aber bekomme es nicht hin die Element und ihre Attribute zusammenhängend an zu zeigen ( bzw. in einem array zu speichern)?

Z. Bsp.:

Bottles
|
Bottle
|-- Bottel Name = Ananasaft
|-- Volume = 750
|-- filllevel = 735
|-- position = 6
|-- image= Granini_Ananas.png
|-- isActive= true
|-- category =Juice
|-- Calibration name= Ananas Cal
|-- openingTime=9609
|-- volume=100
.......
Cocktails
|
Cocktail
|-- Cocktail name=Alice NA+
|-- image= 100_Alice.png
|-- mix=Alice NA+
|-- Preparation name=""
|-- text=Glas mit 4 Eiswürfel füllen + Sahne
|-- cocktailCounter= 0

usw........

Könntet jemand hier weiterhelfen bzw. einen Tip geben wie man am besten dran geht !

Vielen Dank

Gruss Marcus
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@najus: In einem Array willst Du das eher nicht speichern aber Du meintest wahrscheinlich eine Liste. Das sind unterschiedliche Datentypen. Listen hat Python bereits als Grunddatentyp. Bei Arrays meint man in der Regel den/die Datentypen aus dem Numpy-Paket.

Der gezeigte Code ist ja sehr rudimentär. Du schreibst ja nicht einmal Funktionen. Für GUIs braucht man in der Regel Klassen. Und auch so eine Datenstruktur würde man auf (Daten)Klassen abbilden. Auch wenn man das mit Wörterbüchern und Listen lösen könnte, wird so etwas schnell unübersichtlich und Wörterbücher die immer einen festen Satz an Schlüsseln haben, sind besser als Objekte modelliert.

Man würde sich dann ein Datenmodell überlegen auf dem man die gewünschten Operationen effizient durchfürhen kann und dann Code schreiben der so ein XML-Dokument in die entworfene Datenstruktur überführt und Code der das Gegenteil macht, also die Datenstruktur als XML serialisiert. Dabei kann man sich wahrscheinlich eng an der XML-Struktur orientieren, aber wenn es zu jedem <Cocktail> genau einen passenden <Mix> gibt, würde man das in einem Objekt zusammenfassen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten