Problem mit verschachtelten for-Schleifen

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
PhantomWorks
User
Beiträge: 18
Registriert: Samstag 25. April 2009, 11:11

Hallo!

Ich habe ein Problem, glaube aber dass es sich lediglich um einen Denkfehler handelt.

Ich habe ein XML Dokument mit mehreren Ebenen. Dieses habe ich mit etree geparsed. Ich muss nun aus diesem Dokument bestimmte Tagnamen, Tagattribute und Taginhalte auslesen und am Ende wieder in ein neues XML-File mit anderer hierarchischer Struktur schreiben.

Das heißt: Ich benötige einen Tagnamen von Ebene 4 aus dem Ausgangsdokument, muss ihn aber im zu erzeugenden Dokument auf der 2. Ebene verwenden.

Bisheriges Vorgehen bei der Erschließung

Code: Alles auswählen

for Node in root:
    if Node.tag =="Name":
        Name = Node.text
    if Node.tag =="Adresse":
        Adresse = Node.text
    for SubNode_level_1 in Node:
        if SubNode.get("Phone") == "Tel":
            Telefonnummer = SubeNode.get("Phone")
        for SubNode_level_2 in SubNode_level_1:
             Stadt = SubNode_level_2.text
  

All diese Daten (Name, Adresse, Telefonnummer, Stadt_HH) sollen nun in ein neues XML-File geschrieben werden.
Es existieren also pro Ebene mehrere Geschwisterknoten, die alle in das neue XML-File geschrieben werden sollen, nur eben manchmal nicht auf der gleichen Ebene
Mache ich nun also:


Code: Alles auswählen

for Node in root:
    if Node.tag =="Name":
        Name = Node.text
    if Node.tag =="Adresse":
        Adresse = Node.text
    for SubNode_level_1 in Node:
        if SubNode.get("Phone") == "Tel":
            Telefonnummer = SubeNode.get("Phone")
        for SubNode_level_2 in SubNode_level_1:
            Stadt = SubNode_level_2.text
            out.write('<ab:name>' + Name + '</ab:name>')
            out.write('<ab:Stadt>' + Stadt + '</Stadt>')
            out.write('<ab:street-address>' + Adresse + '</ab:street-address>\n')
            out.write('<ab:Fon>' + Telefonnummer + '</Fon>')
Dann habe ich das Problem, dass ALLES zu oft geschrieben wird, logisch, steht ja auch in der untersten for-Schleife

In der neuen XML-Datei sollen aber Name, Adresse Stadt nur ein einziges Mal auftauchen, die Telefonnummer kann und soll öfter auftreten, da davon mehrere existieren

Mache ich nun das:

Code: Alles auswählen

for Node in root:
    if Node.tag =="Name":
        Name = Node.text
    if Node.tag =="Adresse":
        Adresse = Node.text
    for SubNode_level_1 in Node:
        if SubNode.get("Phone") == "Tel":
            Telefonnummer = SubeNode.get("Phone")
        for SubNode_level_2 in SubNode_level_1:
            Stadt = SubNode_level_2.text
out.write('<ab:name>' + Name + '</ab:name>')
out.write('<ab:Stadt>' + Stadt + '</ab:Stadt>')
out.write('<ab:street-address>' + Adresse + '</ab:street-address>\n')
out.write('<ab:Fon>' + Telefonnummer + '</ab:Fon>')
wird zwar alles nur einmal geschrieben, doch leider auch die telefonnummer, da die Variable ja bei jedem Durchlauf wieder überschrieben wird.
Die Reihenfolge der Elemente in der zu erzeugenden Datei ist vorgeschrieben, d.h. Name-->Stadt-->street-adress-->Fon

Wo liegt mein gedanklicher Fehler?

Viele Grüße
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also ich halte die gesamte Vorgehensweise für unglücklich! Du nutzt einerseits einen Parser, erzeugst dann aber per String XML-Code - *urgs*! Wieso nutzt Du nicht die Fähigkeiten des Parsers XML zu erzeugen?

Desweiteren würde ich ja lxml nutzen und damit dann XPath-Ausdrücke um an die Elemente zu kommen. Aber ok, das kann man auch anders machen.

Zu Deinem Problem: Ist da die Einrückung tatsächlich der Unterschied? Wenn ja kapiere ich irgend wie nicht, was Du machen willst! Du scheinst offenbar keine Ahnung zu haben, was in den Schleifen passiert. Zeig uns doch mal bitte eine minimale XML-Datei! So kann man sich zwar einiges denken, aber exakt wissen kann man nicht, was Du da bezweckst.
PhantomWorks
User
Beiträge: 18
Registriert: Samstag 25. April 2009, 11:11

Danke für Deine Antwort!

Ja ich weiß *schäm*, die String-Ausgabe ist echt nicht das Gelbe vom Ei. Da ich viel mit XML-Arbeite in allen Varianten (Datei-->XML, XML-->Datei, XML-->XML) muss ich mir echt mal so bald wie möglich lxml zu Gemüte führen.

Hast Du da evtl. eine gute Quelle um damit anzufangen? Das Short Tutorial ist nicht wirklich ergiebig
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also ich habe nur die offizielle Seite von lxml bemüht und mir dann an einfachen Beispielen selber Dinge verdeutlicht. Man muss sich eh darin reinfuchsen :-)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Du könntest beispielsweise die komplette Doku bemühen:
Als PDF oder online
Antworten