Verarbeitung von XML in Python

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Cenza
User
Beiträge: 2
Registriert: Montag 30. Januar 2012, 13:05

Hallo,

meine Frage bezieht sich auf die Verarbeitung eines XML-Dokuments in einem Python-Skript. Ich moechte gerne wissen, wie ich testen kann, ob das Programm (Python-Skript) das macht, was es soll. Das Python-Skript soll lediglich bestimmten Text ausgeben, sobald es auf ein Element mit der Bezeichnung <first> bzw. <last> trifft. Beide Dateien befinden sich im selben Verzeichnis.

Die Ausfuehrung des Python-Skripts (python dateiname.python) hat nicht zum Ziel gefuehrt.
Meine XML-Datei (address.xml) sieht wie folgt aus:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8" ?>
<addresses>
    <person>
        <name>
            <first>Klaus</first>
            <last>Mustermann</last>
        </name>
        <city>Berlin</city>
        <country>Germany</country>
    </person>
    <person>
        <name>
            <first>Martin</first>
            <last>Weiss</last>
        </name>
        <city>Altenbek</city>
        <country>Germany</country>
<addresses>
Hier das Python-Skript (xml_address.py) dazu:

Code: Alles auswählen

import xml.sax
class AddressHandler(xml.sax.ContentHandler):
    def __init__(self):
        print "Irgend was..."
    def startElement(name, attr):
        if name == "first":
            print "Das ist der Vorname des Kunden."
        elif name == "last":
            print "Das ist der Nachname des Kunden."
            
    def endElement(name):
        if name == "first":
            print "Ende first"
        elif name == "last":
            print "Ende last"
     
def lade_addressHandler(datei):
    datei = open("address.xml", "r")    
    handler = AdressHandler()
    parser = sax.make_parser()
    parser.setContentHandler(handler)
    parser.parse(open("address.xml"))

Vielen Dank im Voraus.
Cenza
Zuletzt geändert von Anonymous am Dienstag 31. Januar 2012, 09:45, insgesamt 1-mal geändert.
Grund: Quelltexte in entsprechende Code-Tags gesetzt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo,

Du musst bei der Angabe von Code immer die entsprechenden Code-Tags verwenden. Für Python-Code haben wir sogar spezielle Python-Code-Tags - bei denen wir der Quellcode dann noch hübsch mit Syntaxhighlighting hervorgehoben :-)

Bei Deinem Posting sind sämtliche Einrückungen verloren gegangen - und die sind in Python nun mal ein wichtiges Sprachelement.

Also editiere Deinen Beitrag einfach noch einmal, damit wir den Code besser nachvollziehen können.

Dennoch bereits eine kurze Frage: Muss es denn die SAX-API sein? Also gibt es Gründe, die das zwingend notwendig machen? Wenn nicht, würde ich sofort die ElementTree-API vorschlagen. Einen entsprechenden Parser findest Du ebenfalls in der Standard-Lib; bei größeren Ansprüchen wie Validierung oder XPath gibt es dann noch das exzellente `lxml`-Modul, welches Du allerdings nachinstallieren musst.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Cenza
User
Beiträge: 2
Registriert: Montag 30. Januar 2012, 13:05

Hallo Hyperion,

dank fuer die Antwort. Fuer kuenftige Fragen weiss ich nun Bescheid. Ja, es muss SAX sein, aber inzwischen habe ich das Programm zum Laufen gebracht. Das, was gefehlt hat, war die Definition und Initialisierung von 2 Variablen im Konstruktor.

Vielen Dank!
Cenza
BlackJack

@Cenza: Du öffnest die XML-Datei einmal unnötig. Und das XML ist kaputt. Es fehlt ein schliessendes ``person``-Tag und das letzte Tag sollte auch ein End-Tag sein.

Warum muss es SAX sein? Die `ElementTree`-API ist weniger überladen und komplex und ebenfalls in der Standardbibliothek. Und riecht nicht so nach Java. :-)

Code: Alles auswählen

from xml.etree import ElementTree as etree


def main():
    for event, node in etree.iterparse('test.xml', ['start', 'end']):
        if event == 'start':
            if node.tag == 'first':
                print 'Das ist der Vorname des Kunden.'
            elif node.tag == 'last':
                print 'Das ist der Nachname des Kunden.'
        elif event == 'end':
            if node.tag == 'first':
                print 'Ende first'
            elif node.tag == 'last':
                print 'Ende last'


if __name__ == '__main__':
    main()
Antworten