Xml datei parsen--> mehrere Knoten name?

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
samy10
User
Beiträge: 2
Registriert: Dienstag 19. Februar 2013, 16:47

Hallo zusammen,
ich bin neu be Python und habe versucht eine xml datei mit python rekursiv durchzlaufen mit dem punkt separator und hab's auch geschafft, aber ich habe da ein kleines Problem es gibt mehrere Knoten mit den selben namen.
Beispiel:
a.b.c.d=2
a.b.c.d=3
a.b.c.d=4
ich wollte immer am Ende des letzten elments eine zähler hinzufügen.
es soll so aussehen:
a.b.c.d1=2
a.b.c.d2=3
a.b.c.d3=4
das ist mein code:

Code: Alles auswählen

import xml.etree.ElementTree as etree



tree = etree.parse("TestData.xml")
root = tree.getroot()
   
a = open("py-eingabe.txt","w")

def rekursiv(element, text="", sep="."):
    children = element.getchildren()
    if children:
        for child in element.getchildren():
            rekursiv(child, text=text+sep+child.tag)
    else:
        try:
            a.write(text+ " = " + element.text + ";\n")
 
        except:
            a.write(text + "= 0 \n")

rekursiv(root, text=root.tag)
Zuletzt geändert von Anonymous am Dienstag 19. Februar 2013, 18:20, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@samy10: Man könnte ein Wörterbuch mitführen wo man sich die Pfade merkt, die man schon gesehen hat und die auf einen Zähler abbilden. `collections.defaultdict()` würde sich da anbieten. Wobei es problematisch wird wenn die Nummern nur vergeben werden sollen wenn es mehrere gleiche Pfade gibt, denn dann muss man ja schon nach weiteren suchen bevor man den ersten Namen mit der 1 versehen darf. Sollen die Nummern global gezählt werden, oder nur bei direkt aufeinanderfolgenden gleichen Namen?

Edit: Namen wie `a` für eine Datei taugen nichts. Namen sollten dem Leser verraten was für eine Bedeutung der daran gebundene Wert hat. Und nackte ``except``\s sollte man meiden. Das trifft ja zum Beispiel auch Tippfehler bei Namen, die zu einem `NameError` oder `AttributeError` führen, und wenn man die nicht zu Gesicht bekommt, weil irgend ein ``except:`` die „verschluckt”, kann man solche Fehler ewig suchen.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo samy10,

globale Variablen sollte man immer zu vermeiden versuchen, also die Ausgabedatei, wie Du es mit sep ja
schon machst, einfach durchreichen. Welche Exception soll denn abgefangen werden?
Dass element.text None ist? Dann mach das hier explizit per if-Abfrage und vermeide die Wiederholung
des write.
Hier mal ein kleines Beispiel, wie Du die Anzahl der Elemente mit gleichem Tag zählen kannst:

Code: Alles auswählen

total_counts = collections.Counter(c.tag for c in children)
Dann einfach abfragen, ob es mehr als einen Tag mit diesem Namen gibt und einen zweiten Counter
entsprechend hochzählen.
samy10
User
Beiträge: 2
Registriert: Dienstag 19. Februar 2013, 16:47

Hallo zusammen,
Danke für eure hilfe. ich werd's mit collections.defaultdict() versuchen.Ich glaube, das wäre die beste und einfachste Lösung.
meld mich später, falls es klappen würde.
Antworten