2012-06-18 5 views
2

Я пытаюсь использовать suds version 0.4 с python версии 2.7.1 для доступа к apap apap, но я получаю ошибки, пытаясь создать объект Client. Самая простая форма заключается в следующем:Разбор WSDL с включенными XSD, которые ссылаются друг на друга

from suds.client import Client 

url = 'http://tool-sb-api.hescloud.net/session/wsdl' 
c = Client(url, cache=None) 

ошибка, который производится:

suds.TypeNotFound: Type not found: '(retrieveSessionByIdResponse, http://hes.lbl.gov/scoring_tool/session,)' 

Я пробовал несколько вариантов использования ImportDoctor в соответствии с documented подходов, но я получаю ту же ошибку.

После осмотра WSDL и отладочные сообщения из мыльной пены, она, кажется, есть список из включает в себя

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://hes.lbl.gov/scoring_tool/session" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="HesAPI_Session" targetNamespace="http://hes.lbl.gov/scoring_tool/session"> 
    <types> 
     <xsd:schema targetNamespace="http://hes.lbl.gov/scoring_tool/session"> 
      <xsd:include schemaLocation="http://tool-sb-api.hescloud.net/public/xsd/session/input/newSessionFromAddress.xsd"/> 
      <xsd:include schemaLocation="http://tool-sb-api.hescloud.net/public/xsd/session/output/newSessionFromAddressResponse.xsd"/> 
      <xsd:include schemaLocation="http://tool-sb-api.hescloud.net/public/xsd/session/input/newLabelSession.xsd"/> 
      ... 

, которые ссылаются друг на друга. Вот пример xsd, который делает это (newSessionFromAddressResponse.xsd).

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema targetNamespace="http://hes.lbl.gov/scoring_tool/session" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://hes.lbl.gov/scoring_tool/session"> 
    <xsd:element name="newSessionFromAddressResponse"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="returnCode" type="xsd:int"/> 
     <xsd:element name="returnComment" type="xsd:string"/> 
     <xsd:element name="readOnly" type="xsd:string"/> 
     <xsd:element ref="tns:AddressList"/> 

     <!-- RetrieveSessionByIdResponse is defined in retrieveSessionByIdResponse.xsd. In the event of an error, we won't have a retrieveSessionByIdResponse, hence minOccurs=0 --> 
     <xsd:element ref="tns:retrieveSessionByIdResponse" minOccurs="0" maxOccurs="1"/> 

     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 

    <xsd:element name="AddressList"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="address" type="xsd:string"/> 
     <xsd:element name="city" type="xsd:string"/> 
     <xsd:element name="state" type="xsd:string"/> 
     <xsd:element name="zipcode" type="xsd:string"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 

кажется мыльной пены возникают проблемы с

<xsd:element ref="tns:retrieveSessionByIdResponse" minOccurs="0" maxOccurs="1"/> 

определяется в другом файле.

Я не уверен, что этот WSDL следует за WSI-BP 1.0 в качестве менеджеров этого заявления API или если проблема связана с тем, что пена не может должным образом обработать атрибут «ref».

В любом случае, я был бы счастлив с успешно созданным клиентом.

ответ

2

Я решил эту проблему, создав DocumentPlugin, чтобы загрузить содержимое файлов xsd непосредственно в документ перед его анализом.

Мне пришлось переопределить функцию loaded и сделать это с помощью minidom (хотя любая библиотека xml будет работать). Я не мог переопределить функцию parsed, потому что я не мог легко создать пенообразование Element (для этого требуется переменная options, содержащая информацию, которая, вероятно, была недоступна).

пенообразующие документы создают документPlugin here.

+0

Уход за предоставлением соответствующего кода? Спасибо – Jorge

+0

@Jorge Извините, это было некоторое время назад. Я не думаю, что код уже существует :) – almostflan

Смежные вопросы