Hinzufügen von xsi: Typ und Umschlag Namespace bei Verwendung von SUDS

Ich muss mit einem SOAP-Service interagieren und habe viel Mühe, dies zu tun; Würde schätzen alle Hinweise darauf. Die ursprüngliche Fehlermeldung war:

org.apache.axis2.databinding.ADBException: Any type element type has not been given 

Nach einigen Recherchen stellt sich heraus, dass dies eine Meinungsverschiedenheit zwischen SUDS und der Server hat, wie mit umzugehen

 type="xsd:anyType" 

Auf das betreffende Element.

Ich habe mit SOAPUI bestätigt und nach Rat, dass das Problem behoben werden kann, indem Sie diese Schritte ausführen:

  1. Hinzufügen von xsi: type = "xsd: string" zu jedem Element, das Probleme verursacht
  2. Hinzufügen von xmlns: xsd = "http://www.w3.org/2001/XMLSchema" zum SOAP-Umschlag

Also, wo SUDS dies derzeit tut:

 <SOAP-ENV:Envelope ... xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <ns3:Body> <ns0:method> <parameter> <values> <table> <key>EMAIL_ADDRESS</key> <value>example@example.org</value> </table> </values> </parameter> </ns0:method> 

Es sollte stattdessen dies produzieren:

 <SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <ns3:Body> <ns0:method> ... <parameter> <values> <table> <key xsi:type="xsd:string">EMAIL_ADDRESS</key> <value xsi:type="xsd:string">example@example.org</value> </table> </values> </parameter> </ns0:method> 

Gibt es einen richtigen Weg, dies zu tun? Ich habe Vorschläge für die Verwendung von ImportDoctor oder MessagePlugins gesehen, aber habe nicht wirklich grokked, wie man den gewünschten Effekt zu erzielen.

2 Solutions collect form web for “Hinzufügen von xsi: Typ und Umschlag Namespace bei Verwendung von SUDS”

Die Lösung, die ich gefunden habe, war, ein MessagePlugin zu benutzen, um das XML manuell kurz vor dem Senden manuell zu fixieren. Ich hatte gehofft, dass es etwas eleganteres gab, aber das funktioniert zumindest:

 class SoapFixer(MessagePlugin): def marshalled(self, context): # Alter the envelope so that the xsd namespace is allowed context.envelope.nsprefixes['xsd'] = 'http://www.w3.org/2001/XMLSchema' # Go through every node in the document and apply the fix function to patch up incompatible XML. context.envelope.walk(self.fix_any_type_string) def fix_any_type_string(self, element): """Used as a filter function with walk in order to fix errors. If the element has a certain name, give it a xsi:type=xsd:string. Note that the nsprefix xsd must also be added in to make this work.""" # Fix elements which have these names fix_names = ['elementnametofix', 'anotherelementname'] if element.name in fix_names: element.attributes.append(Attribute('xsi:type', 'xsd:string')) 

Es ist traurig und urkomisch, wie eine Menge Dinge über diese besondere Bibliothek, aber hier ist die genaue Antwort:

http://lists.fedoraproject.org/pipermail/suds/2011-September/001519.html

von Oben:

 soapenv = soapenv.encode('utf-8') plugins.message.sending(envelope=soapenv) 

wird:

 soapenv = soapenv.encode('utf-8') ctx = plugins.message.sending(envelope=soapenv) soapenv = ctx.envelope 

Im Grunde genommen ist es ein Fehler in der Implementierung, und du kannst es selbst pflücken, indem du die Zeile bearbeite, die das Plugin ausführt, um tatsächlich die Ergebnisse des Plugins zurückzugeben, aber ich bin mir nicht bewusst, dass es eine gepatchte und aktualisierte Version von SUDS gibt, die das noch behebt (tho Ich habe nicht genau darauf hingewiesen).

  • Lxml.etree und xml.etree.ElementTree Hinzufügen von Namespaces ohne Präfixe (ns0, ns1, etc.)
  • Wie benutzt man Xpath in Python?
  • Wie kann ich mich in Pausen einblenden?
  • Ändern Sie Namespaces in einem gegebenen XML-Dokument mit lxml
  • Builtins.TypeError: Lesen von Dateiobjekten muss auf einfache Strings zurückkehren: Fehler in Xpath - Python
  • Ausgeben von Namensraumspezifikationen mit ElementTree in Python
  • Ziehen Sie Java-Fehler-Stacks aus Protokolldateien heraus
  • Holen Sie alle Eltern von xml Knoten mit Python
  • Warum ist BeautifulSoup nicht in der Lage, dieses RSS (XML) Dokument korrekt zu lesen / zu analysieren?
  • BeautifulSoup kehrt zurück [], wenn ich es laufe
  • Unterdrückung von Namensraumpräfixen in ElementTree 1.2
  • Python ist die beste Programmiersprache der Welt.