XML parsen?

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.
sadway
User
Beiträge: 12
Registriert: Sonntag 22. Juli 2007, 16:41

XML parsen?

Beitragvon sadway » Dienstag 4. September 2007, 11:01

Hallo!

Ich möchte gerne eine xml Datei auslesen. Nach einiger Recherche bin ich auf ElementTree gestoßen, welches für mich so aussieht, als könnte es funktionieren.

So wie ich es jedoch versuche scheint es mir ein wenig plump und unelegant.
Da muss es doch andere Möglichkeiten geben?!

Hier habe ich eine xml Datei, welche aus Rhythmbox stammt. Aus dieser möchte ich die statischen Playlisten (type="static") auslesen und die enthaltenen Lieder zusammen mit dem Namen der Liste in einer Liste speichern.

playlist.xml

Code: Alles auswählen

<?xml version="1.0"?>
<rhythmdb-playlists>
  <playlist name="Beste Bewertung" type="automatic" sort-key="Rating" sort-direction="1">
    <conjunction>
      <equals prop="type">song</equals>
      <subquery>
        <conjunction>
          <greater prop="rating">1,000000</greater>
        </conjunction>
      </subquery>
    </conjunction>
  </playlist>
  <playlist name="Test" type="static">
    <location>file:///lied1.mp3</location>
    <location>file:///lied2.mp3</location>
  </playlist>
  <playlist name="Test2" type="static">
    <location>file:///lied3.mp3</location>
    <location>file:///lied4.mp3</location>
  </playlist>
</rhythmdb-playlists>


Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

from xml.etree.ElementTree import ElementTree

try:
   root = ElementTree(file="playlists.xml")
except:
   print "ERROR: No valid XML-File"
   exit()

iter = root.getiterator("playlist")
for item in iter:
   if item.keys():
      for name, wert in item.items():
         if name == "type" and wert == "static":
            print "Eine gefunden"
            for child in item:
               print child.text
            


Auf meine momentane Art wäre es doch wahrscheinlich einfacher die Datei zeilenweise einzulesen und mit find mir die Tags auszusuchen. Deshalb frage ich mich was ich falsch mache :(

Vielen Dank!

PS: Was ist eigentlich iter ??? ich habe das aus einem Tutorial übernommen, finde jedoch keine halbwegs gute Erklärung.
sadway
User
Beiträge: 12
Registriert: Sonntag 22. Juli 2007, 16:41

Beitragvon sadway » Dienstag 4. September 2007, 12:00

Ich habe jetzt hier etwas gefunden, mit dem ich besser leben kann:
http://www.python-forum.de/post-72806.html#72806

Aber wenn ihr noch Ideen oder Tipps habt, höre ich die gerne.
BlackJack

Beitragvon BlackJack » Dienstag 4. September 2007, 12:12

Ich würde es so schreiben.

Code: Alles auswählen

def main():
    root = etree.fromstring(source)
    playlists = root.findall('playlist')
    static_playlists = (p for p in playlists if p.get('type') == 'static')
    for playlist in static_playlists:
        for location in playlist.findall('location'):
            print location.text


Speziell das entpacken von `item.items()` in der ``for``-Schleife bei Deinem Quelltext kann sehr schnell auf die Nase fallen, wenn da mal nicht zufällig *genau zwei* Attribute existieren.

`iter()` ist eine Funktion die in der Doku beschrieben ist. Die benutzt Du aber gar nicht, sondern Du bindest etwas anderes an diesen Namen. Das ist in der Regel keine gute Idee.
sadway
User
Beiträge: 12
Registriert: Sonntag 22. Juli 2007, 16:41

Beitragvon sadway » Dienstag 4. September 2007, 12:27

Vielen Dank für deine Hilfe. Das sieht gleich sehr viel besser aus.
:)

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]