Python und Rekursion


Oetzicool

Erfahrenes Mitglied
Hey Leute ich habe ein kleines Problem, ich schreib grad ein Pythonplugin, dass eine XML file parsed und sobald sie den richtigen Tag gefunden hat, soll der Wert des Tags ausgegeben werden,
dies funktioniert aber nicht, hiermal der Code könnt ihr mir sagen was da falsch ist:
Code:
import xml.dom.minidom as dom
import time

def traffic_handler(name):
   datei = "traffic.xml"
   amount = 0

   baum = dom.parse(datei)
   for eintrag in baum.childNodes:
        print 'Davor', amount
        amount = getChild(eintrag)
        print 'Danach',amount
   return amount

# Rekursionsfunktion geht
# durch alle Knoten durch
# bis er passendes Element
# gefunden hat
def getChild(node):

   for entry in node.childNodes:
     if entry.hasChildNodes():
       getChild(entry)
     else:
       if (node.nodeName == 'in'):
        print 'In der Funktion', entry.data
        return entry.data


traffic_handler(None)
Und die Ausgabe sieht folgendermaßen aus:

Code:
Davor 0
In der Funktion: 2331,22
Danach None
Danke schonmal :D
 

deepthroat

Erfahrenes Mitglied
Hi.

Du hast das return bei getChild(entry) vergessen. So gibt deine Funktion nichts zurück wenn entry keine Kindknoten hat.

Gruß
 

Oetzicool

Erfahrenes Mitglied
Hey danke für die schnelle Antwort,
also es ist ja so ich kenne die Struktur von meiner XML file ja schon und weiß das der Tag <in> als letztes Blatt eines Baum existiert, also so
Code:
<traffic>
    <Amount>
         <in>234</in>
         <out>12</out>
    </Amount>
</traffic>
Ich will ja nicht das er was zurückgibt wenn ein Knoten Kinder hat, da ich ja weiß das ich auf die unterste Ebene kommen will.
und erst wenn er den Eintrag <in> hat, soll er den demenstprechenden wert zurückgegben.
 

deepthroat

Erfahrenes Mitglied
Hey danke für die schnelle Antwort,
also es ist ja so ich kenne die Struktur von meiner XML file ja schon und weiß das der Tag <in> als letztes Blatt eines Baum existiert, also so
Code:
<traffic>
    <Amount>
         <in>234</in>
         <out>12</out>
    </Amount>
</traffic>
Ich will ja nicht das er was zurückgibt wenn ein Knoten Kinder hat, da ich ja weiß das ich auf die unterste Ebene kommen will.
und erst wenn er den Eintrag <in> hat, soll er den demenstprechenden wert zurückgegben.
Deine Funktion muß in jedem Fall einen Wert zurückgeben. Es funktioniert nicht nur einen Wert am Ende der Rekursion zurückzugeben.

Entweder hast du das gesuchte Element gefunden, dann gibst du dessen Wert zurück.

Oder du hast es noch nicht gefunden, dann gibst du den Wert zurück, der durch den rekursiven Aufruf berechnet wird.

Gruß
 

Oetzicool

Erfahrenes Mitglied
Also ich habs jetzt komplett anders gemacht und damit auch gleich den Code ein wenig entschlackt ich hab mich für die native Funktionen von DOM entschieden und jetzt läufts einwandfrei, für die die ein ähnliches Problem haben hier mal mein Code:
Code:
import xml.dom.minidom as dom

dateiname = 'traffic.xml'

def lade_xml(dateiname):
  # Parse datei
   baum = dom.parse(dateiname)
  # Suche alle Tags mit 'in'
   for e in baum.getElementsByTagName('in'):
        # Gebe mir alle Werte von 'in' aus
        for node in e.childNodes:
           print node.data
lade_xml(dateiname)
Aber danke nochmal für eure hilfe :)