Problem mit etree und auslesen von XML Datei

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
Jurudoca
User
Beiträge: 23
Registriert: Dienstag 26. Juli 2011, 13:58

Ich bin recht neu dabei mit python und will eine XML Datei auslesen. Es geht dabei um das Auslesen/ansprechen bestimmter tags...

Meine Datei hat folgende Struktur:

Code: Alles auswählen

<sss version="1.2">
        <date>2011-09-23</date>
        <time>12:32:29</time>
        <origin>OPST</origin>
        <user></user>
        <survey>
            <name>Test</name>
            <version>2011-09-02 15:50:10</version>
            <record ident="A">
                <variable ident="10" type="quantity">
                    <name>v_682</name>
                    <label>Another question</label>
                    <position start="23" finish="24"/>
                    <values>
                        <range from="0" to="32"/>
                    </values>
                </variable>
                <variable ident="11" type="quantity">
                    <name>v_683</name>
                    <label>another totally another Question</label>
                    <position start="25" finish="26"/>
                    <values>
                        <range from="0" to="33"/>
                    </values>
                </variable>
                <variable ident="12" type="quantity">
                    <name>v_684</name>
                    <label>And once more Question</label>
                    <position start="27" finish="29"/>
                    <values>
                        <range from="0" to="122"/>
                    </values>
                </variable>
                <variable ident="20" type="single">
                    <name>v_685</name>
                    <label>Question with alternatives</label>
                    <position start="73" finish="73"/>
                    <values>
                        <range from="1" to="6"/>
                        <value code="1">Alternative 1</value>
                        <value code="2">Alternative 2</value>
                        <value code="3">Alternative 3</value>
                        <value code="6">Alternative 4</value>
                    </values>
                </variable>
            </record>
        </survey>
    </sss>
um die Elemente aus der Datei auszulesen, habe ich mir einen eher schlechten Loop entwickelt, der sicherlich hinter den Möglichkeiten der etree library zurückfällt....

Code: Alles auswählen

  from xml.etree.cElementTree import parse
    et = parse(open('scheme.xml','rb'))
    root = et.getroot()
    for i in range(4):
        a= str(root[4][2][i][0].text)
        if a.startswith('v'):
            print root[4][2][i][1].text 
Wie kann ich beispielsweise den Text innerhalb des value tags auslesen? Welche möglichkeiten für einen Loop gibt es da?

Habe mich schon in diversen Tutorials umgeschaut, aber so richtig verstanden nicht...

Viele Grüße
Jurudoca
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Z.B. so:

Code: Alles auswählen

from xml.etree import ElementTree as ET

root = ET.XML("""
...hier steht dein XML...
""")

for e in root.findall("survey/record/variable/values/value"):
    print e.text
Wenn du lxml statt der eingebauten XML-Bibliothek benutzen würdest, hättest du nicht nur ein zu ET kompatibles API, sondern könntest auch mit XPath oder JQuery-artigem CSS nach Elementen suchen. XPath ist zwar auch keine einfache Sprache, erlaubt aber sehr kompakte Ausdrücke, um eine gesuchte Knotenmenge zu beschreiben.

Stefan
Jurudoca
User
Beiträge: 23
Registriert: Dienstag 26. Juli 2011, 13:58

Hi Stefan,
danke Dir...das macht mich echt glücklich...diese /.../..../ habe ich noch nicht gesehen...das funktioniert echt gut...

Grüße
Jurudoca
Benutzeravatar
ocoal
User
Beiträge: 32
Registriert: Mittwoch 20. Juli 2011, 22:44

Hallo Jurudoca,

vielleicht noch hier eine kleine Alternative zu etree für Dich.

Ich habe für viele kleinere Projekte und Tools/Skripte gerne in letzter Zeit immer wieder auf die Bibliothek: zurückgegriffen.

Die Syntax/Benutzung von PyQuery ist stark an die Query-artige Suche von jQuery angelehnt. Vielleicht sagt es Dir ja zu.

Ich habe etree parsing immer als sehr unschön empfunden. Mit PyQuery habe ich inzwischen wieder Spass am XML parsen gefunden ;).

Viele Grüße,

-Colin-
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Das von mir schon zuvor erwähnte lxml kann mit cssselect vieles von pyquery von Haus aus: http://lxml.de/cssselect.html Ein Blick auf XPath lohnt aber auch. Umständlicher, dafür ein Standard und das Wissen kann man auch zu anderen Sprachen tragen. Andererseits, JQuery ist ja inzwischen auch eine Art von Standard geworden.

Stefan
Jurudoca
User
Beiträge: 23
Registriert: Dienstag 26. Juli 2011, 13:58

@ ocoal: danke für den Hinweis. Das klingt auch interessant. Habe es erst mal mit lxml gemacht...aber PyQuery sieht irgendwie klarer aus...
Antworten