XML Einträge aus Datendatei erstellen

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
bricktop
User
Beiträge: 11
Registriert: Samstag 9. Oktober 2010, 20:50

Montag 13. August 2018, 19:50

Hallo,

ich möchte eine .xml mit Python 3 erstellen. Die Inhalte dafür liegen in anderen Dateien, die ich entsprechend vorher durchscanne.
Im Prinzip gehe ich so vor:

Code: Alles auswählen

a = ET.Element('a')
b = ET.SubElement(a, 'b')
c = ET.SubElement(a, 'c')
d = ET.SubElement(c, 'd')
Jedoch ist hie rdas Problem, dass ich nicht weiß , wie viele dieser Subelemente ich anlegen muss, da das ja in der externen Datei steht.
Anstatt b, c und d müsste ich also einen Laufindex anhängen ,z.B. SubE_i , der theoretisch unendlich gehen kann.
Ich weiß nur nicht wie ich da vorgehen muss..

Später kommen an diese SubElements noch weitere SubElements.

Hat jemand eine Idee?
Sirius3
User
Beiträge: 8270
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 13. August 2018, 20:02

Das macht man mit Schleifen. Wie sieht denn das XML-Format aus?
bricktop
User
Beiträge: 11
Registriert: Samstag 9. Oktober 2010, 20:50

Montag 13. August 2018, 21:02

Sirius3 hat geschrieben:
Montag 13. August 2018, 20:02
Das macht man mit Schleifen. Wie sieht denn das XML-Format aus?
Kein spezielles Format, also ganz normal (wenn es sowas gibt).
So wie in diesem Beispiel, alles unter root:

Code: Alles auswählen

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
    </country>
</data>
nezzcarth
User
Beiträge: 540
Registriert: Samstag 16. April 2011, 12:47

Montag 13. August 2018, 21:31

bricktop hat geschrieben:
Montag 13. August 2018, 21:02
Kein spezielles Format, also ganz normal (wenn es sowas gibt).
So sieht das Beispiel aber nicht aus. XML Dateien können auch nicht kein Format haben, da XML nur eine Serialisierung ist. Sobald du anfängst dir Tag-Namen auszudenken, diese zu verwenden, und ggf. relativ zueinander anzuordnen, hast du schon ein Format. Dein Beispiel sieht relativ elaboriert aus; was du vielleicht meintest ist, dass es kein existentes, spezifiziertes Format ist. Aber etwas selbst ausgedachtes ist ein Format und sollte möglichst irgendwie definiert sein. Es verlangt ja keiner ein XSD Schema oder so, aber überlegt dir halt, welche Tags und Attribute du brauchst und wie die Tags kombiniert werden können.
bricktop
User
Beiträge: 11
Registriert: Samstag 9. Oktober 2010, 20:50

Montag 13. August 2018, 22:48

nezzcarth hat geschrieben:
Montag 13. August 2018, 21:31
bricktop hat geschrieben:
Montag 13. August 2018, 21:02
Kein spezielles Format, also ganz normal (wenn es sowas gibt).
So sieht das Beispiel aber nicht aus. XML Dateien können auch nicht kein Format haben, da XML nur eine Serialisierung ist. Sobald du anfängst dir Tag-Namen auszudenken, diese zu verwenden, und ggf. relativ zueinander anzuordnen, hast du schon ein Format. Dein Beispiel sieht relativ elaboriert aus; was du vielleicht meintest ist, dass es kein existentes, spezifiziertes Format ist. Aber etwas selbst ausgedachtes ist ein Format und sollte möglichst irgendwie definiert sein. Es verlangt ja keiner ein XSD Schema oder so, aber überlegt dir halt, welche Tags und Attribute du brauchst und wie die Tags kombiniert werden können.
ok, aber wie macht man dies nun mit ner Schleife? Ich steh da auf dem Schlauch.
Sirius3
User
Beiträge: 8270
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 13. August 2018, 22:52

Dazu müßte man wissen, was Du genau machen willst.
Benutzeravatar
__blackjack__
User
Beiträge: 1082
Registriert: Samstag 2. Juni 2018, 10:21

Montag 13. August 2018, 23:06

@bricktop: Na Du hast ja die Daten für die Länder in einer sequentiellen Datenstruktur und da schreibst Du eine Schleife drüber die dann das XML-Dokument erstellt.
“Capitalism is the astounding belief that the most wickedest of men will do the most wickedest of things for the greatest good of everyone.” – John Maynard Keynes
bricktop
User
Beiträge: 11
Registriert: Samstag 9. Oktober 2010, 20:50

Dienstag 14. August 2018, 08:09

__blackjack__ hat geschrieben:
Montag 13. August 2018, 23:06
@bricktop: Na Du hast ja die Daten für die Länder in einer sequentiellen Datenstruktur und da schreibst Du eine Schleife drüber die dann das XML-Dokument erstellt.
ja in einer For loop könnte ich sowas machen:

Code: Alles auswählen

max = max_einträge
for i in Range (0, max):
   ET.SubElement(a, 'b')
   ET.SubElement(a, 'c')
    ...
aber ich muss die neu erstellten Sub-Einträge ja eine rVariablen zuweisen, um später wieder weitere Sub-Einträge anzuhängen. Also so:

Code: Alles auswählen

max = max_einträge
for i in Range (0, max):
   sub0 = ET.SubElement(a, 'b')
   sub1 = ET.SubElement(a, 'c')
   ...
Aber wie mache ich das mit dem fortlaufenden sub0..max ?
__deets__
User
Beiträge: 3299
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 14. August 2018, 08:25

Du kannst deine Elemente in einer Liste sammeln, und wieder mit denen arbeiten.
Benutzeravatar
__blackjack__
User
Beiträge: 1082
Registriert: Samstag 2. Juni 2018, 10:21

Dienstag 14. August 2018, 08:35

@bricktop: Ich habe so ein bisschen das Gefühl wir reden hier über Probleme die es gar nicht gibt, weil wir nicht über einen konkreten Fall reden, sondern nur über das was Du denkst was ein Problem und eine Lösung sein könnte, aber nicht über die tatsächlichen Daten. Du hast da zwar eine ``for``-Schleife aber ja nicht über die Daten die dann im XML-Dokument landen sollen. Wo kommt denn `max` her? Das sieht mir nach dem typischen „anti pattern“ aus über eine Indexlaufvariable zu iterieren statt direkt über die Daten.
“Capitalism is the astounding belief that the most wickedest of men will do the most wickedest of things for the greatest good of everyone.” – John Maynard Keynes
Sirius3
User
Beiträge: 8270
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 14. August 2018, 09:23

@bricktop: normalerweise hat man die Daten schon in der passenden Datenstruktur vorliegen, bei Dir also ein Liste. Und in der for-Schleife wird dann das komplette Subdokument generiert, ohne dass man irgendwas zwischenspeichern müßte.

Für Dein obiges Beispiel sieht das dann so aus:

Code: Alles auswählen

data = ET.Element("data")
for country in countries:
    country_element = ET.SubElement(data, "country", name=country['name'])
    ET.SubElement(country_element, "rank", updated="yes").text = str(country["rank"])
    ET.SubElement(country_element, "year").text = str(country["year"])
bricktop
User
Beiträge: 11
Registriert: Samstag 9. Oktober 2010, 20:50

Dienstag 14. August 2018, 22:31

__deets__ hat geschrieben:
Dienstag 14. August 2018, 08:25
Du kannst deine Elemente in einer Liste sammeln, und wieder mit denen arbeiten.
D.h. ich werde die Elemente zuerst im Loop ohne Indexvariable anlegen.
Dann später muss ich das XML wieder scannen und die jeweiligen Elemente finden um dort wieder Sub-Elemente anhängt.
Hab ich das so richtig verstanden?

Das sieht erstmal ein wenig unprofessionell aus (von hinten durch die Brust..) aber scheint mir auch der einzige Weg..
Benutzeravatar
__blackjack__
User
Beiträge: 1082
Registriert: Samstag 2. Juni 2018, 10:21

Dienstag 14. August 2018, 22:46

@bricktop: Was Du machen musst hängt davon ab wie die jeweiligen Strukturen aussehen und ich würde sagen das was Du vorhast klingt tatsächlich übermässig kompliziert. Und wie schon gesagt, Du scheinst hier schon eine Lösung zu planen und Dich darauf zu versteifen, ohne tatsächlich zu wissen was da überhaupt an Datenstruktur auf Dich zukommt. Das ist irgendwie nicht der günstigste Ansatz.

XML ist ein Serialisierungsformat. Ich würde erst einmal schauen wie man die Daten in Python modelliert, und wenn Du da die komplette Struktur hast, eine oder mehrere Funktionen schreiben, die das dann im gewünschten XML-Format serialisieren.
“Capitalism is the astounding belief that the most wickedest of men will do the most wickedest of things for the greatest good of everyone.” – John Maynard Keynes
Antworten