Webservice/XML Problem: Content is not allowed in prolog.

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
Benutzeravatar
Käptn Haddock
User
Beiträge: 169
Registriert: Freitag 24. März 2006, 14:27

Hallo liebe Forenbewohner!

Nach langer Zeit habe ich mal wieder ein Problem:

Ich möchte einen WFS (Geoserver) abfragen und das resultierende XML parsen. Dazu benutze ich folgendes momentan noch einfache Skript:

Code: Alles auswählen

import urllib
import urllib2

base_url = u'http://bwastr-locator.wsv.bund.de/wfsfac/wfs'
version = u'1.1.0'

def _request(data):
    '''
    Evaluates the request and returns the xml document.
    '''
    #request = 'http://bwastr-locator.wsv.bund.de/wfsfac/wfs?SERVICE=WMS&REQUEST=GetCapabilities&VERSION=1.1.0'
    request = urllib2.Request(base_url, urllib.urlencode(data))
    return urllib2.urlopen(request)

def capabilities(service='WMS'):
    
    return _request({'REQUEST': 'GetCapabilities', 'SERVICE': service, 'VERSION':version})

if __name__ == '__main__':
    while True:
        keyin = raw_input('> ')
        if keyin == 'c':
            for line in capabilities().readlines():
                print(line)
        if keyin == 'q':
            exit() 
Die Abfrage funktioniert prinzipiell auch, ich bekomme, wenn ich das Request-Objekt verwende folgende Antwort:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE ServiceExceptionReport>
<ServiceExceptionReport version="1.2.0" xmlns="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc ../wfs/1.0.0/OGC-exception.xsd">
<ServiceException>
Query-Parameter kann nicht decodiert werden: Content is not allowed in prolog.
</ServiceException>
</ServiceExceptionReport
Wenn ich den auskommentierten String verwende kommt das korrekte Capabilities-Dokument zurück. Auf den ersten Blick sieht der encodete data-string korrekt aus und entspricht den Parametern im String.
Ich kenn mich mit XML nicht so gut aus, deshalb frage ich mal hier wo der Fehler liegt, bzw. welche Header-Einstellungen vorzunehmen sind?
Für die Capability-Abfrage lässt sich das noch als String händeln, aber später kommen da noch längere Abfragen, da wär das nicht so toll.

Gruß Uwe
---------------------------------
have a lot of fun!
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Unterschied zwischen den beiden Zeilen ist der, dass das Auskommentierte ein GET-Request, das andere ein POST-Request ist und der Web-Service anscheinend nur GET versteht.

Da Du offensichtlich Python 2 verwendest ist »print« keine Funktion und deshalb die Klammern verwirrend.
BlackJack

@Käptn Haddock: Ich würde übrigens einen Blick auf die `requests`-Bibliothek empfehlen statt sich selbst mit der nicht wirklich schönen `urllib`/`urllib2`-API auseinandersetzen zu müssen.
Benutzeravatar
Käptn Haddock
User
Beiträge: 169
Registriert: Freitag 24. März 2006, 14:27

@Sirius: Wir haben uns das so angewöhnt. Falls wir doch irgendwann mal Python 3 verwenden, ist also nicht allein auf meinem Mist gewachsen...

Danke euch beiden! Werds ausprobieren und melde mich wieder.

Gruß Uwe
---------------------------------
have a lot of fun!
BlackJack

@Käptn Haddock: Ihr habt dann aber hoffentlich ein ``from __future__ import print_function`` oben stehen, denn sonst ist das ja nicht das gleiche. Spätestens bei etwas wie ``print('answer', 42)`` macht das sonst nicht mehr das was es soll. Ansonsten ist es besser keine Klammern zu verwenden, denn die lassen sich bei einem Umstieg auch automatisch durch das 2to3.py-Programm einfügen. Und man sieht beim 2er-Quelltext wenigstens am ``print`` auf den ersten Blick das es Python 2 ist und muss nicht auf Hinweise wie den Inhalt von `urllib` oder das vorhandensein von `urllib2` ausweichen, denn das ist in Python 3 ja alles ein wenig umorganisiert worden. Auch ein Grund für `requests`: Code der das benutzt, kann unter Python 2 und 3 die gleichen Objekte aus dem/den gleichen Modul(en) verwenden.
Benutzeravatar
Käptn Haddock
User
Beiträge: 169
Registriert: Freitag 24. März 2006, 14:27

@BlackJack: Gutes Argument. Werd ich mal überprüfen, ob das ausser mir noch jemand nicht macht ;)

Vielen Dank im übrigen. Funktioniert mit 'requests' aufs allerfeinste.

Schönes Wochenende!

Uwe
---------------------------------
have a lot of fun!
Antworten