XML lesen und in einem Block wegschreiben

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
sunnyraven
User
Beiträge: 17
Registriert: Montag 10. Juni 2013, 13:30

Hallo,
ich stehe gerade etwas auf dem Schlauch, ich bin beim Thema XML und Python noch nicht so auf dem Stan der Dinge. Zu meinem Problem.

Ich versuche eine XML Datei so zu zerlegen, dass ich die Werte dann in eine Datenbank schreiben kann.

Hier die Struktur der XML Datei:

Code: Alles auswählen

<?xml version="1.0"?>
<dat from="2013-06-10 14:19:00" to="2013-06-10 14:19:59" qdate="2013-06-10 14:19:48">
  <dl id="12345678" Off="1" saving="1" tstamp="2013-06-10 14:19:00">
    <device type="iv" key="1" id="123456789">
      <mv type="AA" value="123"/>
      <mv type="BB" value="234"/>
      <mv type="CC" value="567"/>
      <mv type="DD" value="890"/>
	  </device>
    <device type="iv" key="2" id="2468123455">
      <mv type="AA" value="123"/>
      <mv type="BB" value="234"/>
      <mv type="CC" value="567"/>
      <mv type="DD" value="890"/>
	  </device>
	</dl>
  <dl id="24689765" Off="1" saving="1" tstamp="2013-06-10 14:19:00">
    <device type="iv" key="1" id="123456789">
      <mv type="AA" value="123"/>
      <mv type="BB" value="234"/>
      <mv type="CC" value="567"/>
      <mv type="DD" value="890"/>
	  </device>
    <device type="iv" key="2" id="2468123455">
      <mv type="AA" value="123"/>
      <mv type="BB" value="234"/>
      <mv type="CC" value="567"/>
      <mv type="DD" value="890"/>
	  </device>
	</dl>
</dat>
Mit meinem Code möchte ich erreichen, dass für jedes device eine Liste mit mv Elementen ausgegeben wird. Anstatt dem Print soll die Zeile später in eine Datenbank geschrieben werden.

Code: Alles auswählen

mport urllib.request
try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

xmlload = urllib.request.urlopen('http:xxxx')

tree = ET.parse(xmlload)
root = tree.getroot()

for child_dl in root:
    dl_id = child_dl.get('id')
    dl_timestamp = child_dl.get('timestamp')
    for child_device in child_dl:
        device_type = child_device.get('type')
        device_id = child_device.get('id')
        for child_mv in child_device:
            mv_type = child_mv.get('type')
            mv_value = child_mv.get('value')
            if mv_type == ('AA'):
                U_DC = mv_value          
            elif mv_type == ('BB'):
                I_DC = mv_value
            print (dl_timestamp , "," , device_id , "," , device_type , "," , AA , "," , BB)
Meine Ideee hier war die Werte hinter mv mit IF Schleifen zu Variablen hinzuzufügen. Doch das geht ja nicht weil ich immer pro Schleife an der Stelle nur ein wert habe.

Ich glaube ich mache hier einen grundsätzlichen Denkfehler. Was denkt Ihr gehe ich das Ganze falsch an, oder könnte ich mir zum Beispiel auch ein Array bilden mit den Bezeichnungen und den Werten hinter "mv"?

Vielen Dank für Eure Hilfe
BlackJack

@sunnyraven: http://www.if-schleife.de/

Das ``print`` darf nicht *in* der Schleife stehen, wie Du ja schon selber festgestellt hast, sondern muss *nach* der Schleife stehen. Und in der Schleife sammelst Du die Werte aus den <mv>-Elementen. Zum Beispiel in einem Wörterbuch (`dict`). Da kann man leichter mit einem Leeren für jeden Datensatz anfangen. Sonst müsste man die ganzen Namen vor jedem Datensatz beispielsweise an `None` binden.
sunnyraven
User
Beiträge: 17
Registriert: Montag 10. Juni 2013, 13:30

Vielen Dank für die schnelle Hilfe.
Wenn ich den Print in die richtige Schleife schiebe dann ist alles OK. Ist ja auch kar wenn man drüber nachdenkt :oops:

Ist die Lösung so ok, oder gäbe es da auch eine bessere Herangehensweise?
Antworten