python suds falsches Namespace-Präfix in SOAP-Anfrage

Ich verwende python / suds, um einen Client zu implementieren, und ich erhalte falsche Namespace-Präfixe im gesendeten SOAP-Header für einen bestimmten Parametertyp, der von definiert wirdelement ref= in der wsdl.

Die .wsdl-Datei verweist auf eine .xsd-Datei des Datentyps (siehe unten). Das Problem ist mit der FunktionGetRecordAttributes und sein erstes typisches Argumentgbt:recordReferences.

Datei: browse2.wsdl

<code><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>
</code>

Referenzierte Datei: grantabasetypes2.xsd

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

SOAP-Anfrage von suds gesendet:

<code><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>
</code>

Problem : <ns2:recordReferences> hat falsches Präfix, sollte sein<ns0:recordReferences> da es zum Namespace gehört...GrantaBaseTypes definiert in der .xsd.

Dies geschieht für alle durch definierten Argumenteref= in der wsdl. Wie kann dies automatisch behoben werden?

Hinweis: Ich habe überprüft, ob das Präfix "good" vom Dienst akzeptiert wird, indem ich die XML-SOAP-Anforderung manuell per Curl gesendet habe.

AKTUALISIEREN

Ich habe mich in SUDS-Quellcode eingemischt und der folgende empirische Fix erzwingt alle Elemente mitref= Attribut, um den überarbeiteten Namespace anzunehmen (zuvor übernehmen sie den Stammnamespace des Schemas oder was auch immer)tns ist):

Datei: /suds/xsd/sxbase.py

<code>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
</code>

Funktioniert mit meinem Service, aber ich bin nicht sicher, ob es andere Dinge kaputt macht. Ich würde eine intelligentere Lösung bevorzugen, die den SUDS-Quellcode nicht ändert.

Vielen Dank,

Alex

Antworten auf die Frage(4)

Ihre Antwort auf die Frage