python suds неправильный префикс пространства имен в запросе SOAP

Я использую python/suds для реализации клиента и получаю неправильные префиксы пространства имен в отправленном заголовке SOAP для определенного типа параметров, определенных элементом ref=в wsdl.

.wsdl ссылается на файл .xsd типов данных, см. ниже. Проблема связана с функцией GetRecordAttributesи ее первым аргументом типа gbt:recordReferences.

Файл:browse2.wsdl

<xsd:schema targetNamespace="http://www.grantadesign.com/10/10/Browse" xmlns="http://www.grantadesign.com/10/10/Browse" xmlns:gbt="http://www.grantadesign.com/10/10/GrantaBaseTypes" elementFormDefault="qualified" attributeFormDefault="qualified">
<xsd:import schemaLocation="grantabasetypes2.xsd" namespace="http://www.grantadesign.com/10/10/GrantaBaseTypes"/>
<xsd:element name="GetRecordAttributes">
      <xsd:complexType>
          <xsd:sequence>
              <xsd:element ref="gbt:recordReferences">
              </xsd:element>

Файл, на который указывает ссылка: Grantabasetypes2.xsd

<element name="recordReferences">
  <complexType>
    <sequence>
      <element name="record" minOccurs="0" maxOccurs="unbounded" type="gbt:MIRecordReference"/>
    </sequence>
  </complexType>
</element>

Запрос SOAP, отправленный suds:

<SOAP-ENV:Envelope xmlns:ns0="http://www.grantadesign.com/10/10/GrantaBaseTypes" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://www.grantadesign.com/10/10/Browse" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <ns1:Body>
      <ns2:GetRecordAttributes>
         <ns2:recordReferences>
            <ns0:record>
            </ns0:record>
         </ns2:recordReferences>
      </ns2:GetRecordAttributes>
   </ns1:Body>
</SOAP-ENV:Envelope>

Проблема: имеет неправильный префикс, следует быть , так как он принадлежит пространству имен ...GrantaBaseTypes, определенному в .xsd.

Это происходит для всех аргументов, определенных ref=в файле wsdl. Как это можно исправить автоматически?

Примечание. Я проверил, принимается ли служба «хороший» префикс, вручную отправив XML-запрос SOAP через curl.

ОБНОВЛЕНИЕ

Я вмешался в исходный код SUDS, и следующее эмпирическое исправление заставляет все элементы с атрибутом ref=принимать пространство имен ref-ed (ранее они брали корневое пространство имен схемы или что-то еще tnsis):

Файл: /suds/xsd/sxbase.py

class SchemaObject(object):
....
    def namespace(self, prefix=None):

        ns = self.schema.tns

#FIX BEGIN
        if self.ref and self.ref in self.schema.elements.keys():
            ns = self.ref
#FIX END

Работает с моей службой, но я не уверен, что это сломает другие вещи. Я бы предпочел более разумное решение, которое не меняет исходный код SUDS.

Спасибо,

Алексей

5
задан al_miro 19 April 2012 в 09:12
поделиться