Seite 1 von 1

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

Verfasst: Freitag 24. Januar 2014, 17:20
von Käptn Haddock
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

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

Verfasst: Freitag 24. Januar 2014, 17:48
von Sirius3
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.

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

Verfasst: Freitag 24. Januar 2014, 17:51
von 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.

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

Verfasst: Freitag 24. Januar 2014, 18:05
von Käptn Haddock
@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

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

Verfasst: Freitag 24. Januar 2014, 18:12
von 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.

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

Verfasst: Freitag 24. Januar 2014, 18:24
von Käptn Haddock
@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