我使用python/suds來實現客戶端,並且在wsdl中由element ref=
定義的參數類型的參數的發送SOAP頭中出現錯誤的名稱空間前綴。python在SOAP請求中產生錯誤的名稱空間前綴
.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請求:
<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>
問題:<ns2:recordReferences>
前綴錯誤,應爲<ns0:recordReferences>
,因爲它屬於在.xsd中定義的名稱空間...GrantaBaseTypes
。
這發生在wsdl中由ref=
定義的所有參數。這怎麼能自動修復?
注意:我通過curl手動發送xml SOAP請求來檢查服務是否接受「好」前綴。
UPDATE
我插手與SUDS源代碼和下述經驗修正力與ref=
屬性的所有元件承擔REF-ED命名空間(先前,他們採取在架構根名稱空間或任何tns
是) :
文件:/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源代碼的更智能的解決方案。
感謝,
亞歷
這顯然是在棧中的錯誤; 「自動」是什麼意思?例如,您是否願意與您的工具配合使用不同但同等的XSD?從你所說的話來看,如果你想用本地定義的元素替換ref,它就可以工作;對於所有XSD關心,生成的XML將是相同的。如果你考慮改變航班,比如通過代理使用某種XSLT,那將是一種不同的方法。我可以推薦一個解決方案,它會自動重構您的XSD以替換本地元素。 – 2012-04-18 16:04:56
我真的試圖移動和變化的定義,但因爲我不是專家,也許我coudn't找準正確的語法,泡沫不停地把錯誤的命名空間存在。我也不喜歡這些,因爲它們是由外部供應商提供的,並且可能會發生變化。請參閱UPDATE以獲取迄今爲止發現的非最佳解決方案。 – 2012-04-19 09:18:41