I'm using version 0.3.4 to parse UV index values from epa.gov's SunWise SOAP service. The output includes a complex type with 3 values: alert, forecastDate and index.
The result XML is:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:getUVIndexAlertByZipCodeResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:uvindexalert">
<getUVIndexAlertByZipCodeReturn href="#id0"/>
</ns1:getUVIndexAlertByZipCodeResponse>
<multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:UVIndexAlertResult" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="urn:uvindexalert">
<alert xsi:type="xsd:boolean">false</alert>
<forecastDate xsi:type="xsd:date">2009-02-25</forecastDate>
<index xsi:type="xsd:int">4</index>
</multiRef>
</soapenv:Body>
</soapenv:Envelope>
The forecastDate is returned as <forecastDate xsi:type="xsd:date">2009-02-25</forecastDate>, which would suggest it be handled as an XDate. The traceback location (line 226) suggests that suds is actually treating it as an XDateTime and splitting on a non-existent "T" character.
from suds.client import Client
url = 'http://iaspub.epa.gov/uvindexalert/services/UVIndexAlertPort?wsdl'
client = Client(url)
client.service.getUVIndexAlertByZipCode(in0='37919')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "build/bdist.linux-x86_64/egg/suds/client.py", line 228, in __call__
File "build/bdist.linux-x86_64/egg/suds/client.py", line 367, in call
File "build/bdist.linux-x86_64/egg/suds/client.py", line 228, in __call__
File "build/bdist.linux-x86_64/egg/suds/client.py", line 410, in call
File "build/bdist.linux-x86_64/egg/suds/client.py", line 468, in invoke
File "build/bdist.linux-x86_64/egg/suds/client.py", line 493, in send
File "build/bdist.linux-x86_64/egg/suds/client.py", line 525, in succeeded
File "build/bdist.linux-x86_64/egg/suds/bindings/binding.py", line 135, in get_reply
File "build/bdist.linux-x86_64/egg/suds/bindings/unmarshaller.py", line 302, in process
File "build/bdist.linux-x86_64/egg/suds/bindings/unmarshaller.py", line 87, in process
File "build/bdist.linux-x86_64/egg/suds/bindings/unmarshaller.py", line 103, in append
File "build/bdist.linux-x86_64/egg/suds/bindings/unmarshaller.py", line 180, in append_children
File "build/bdist.linux-x86_64/egg/suds/bindings/unmarshaller.py", line 104, in append
File "build/bdist.linux-x86_64/egg/suds/bindings/unmarshaller.py", line 404, in append_text
File "build/bdist.linux-x86_64/egg/suds/bindings/unmarshaller.py", line 410, in translated
File "build/bdist.linux-x86_64/egg/suds/xsd/sxdate.py", line 273, in translate
File "build/bdist.linux-x86_64/egg/suds/xsd/sxdate.py", line 226, in toPython
ValueError: need more than 1 value to unpack
=============
Line 226 in sxdate.py is part of the XDateTime handler, not XDate as expected.
Adding a filter to include a time in the output XML, makes the output parseable:
from suds.bindings.binding import Binding
Binding.replyfilter = (lambda x,y: y.replace('</forecastDate>', 'T00:00:00</forecastDate>'))
client.service.getUVIndexAlertByZipCode(in0='37919')
(UVIndexAlertResult){
alert = False
forecastDate = 2009-02-25 00:00:00
index = 4
}
--
Jonathan