如何将额外的 xsd 与 python zeep 一起使用?
How can I use an additional xsd with python zeep?
我需要实现一个 SPML 接口,它最终通过 HTTP(s) 执行 SOAP 请求。我有一个 wsdl 可以归结为:
<wsdl:types>
<schema targetNamespace="http://soapadapter.something" xmlns="http://www.w3.org/2001/XMLSchema">
<element name="receiveRequest" type="xsd:anyType"/>
</schema>
</wsdl:types>
[...]
<wsdl:operation name="receiveRequest">
<wsdl:input message="impl:receiveRequestRequest" name="receiveRequestRequest"/>
</wsdl:operation>
如您所见,唯一定义的请求元素是 "xsd:anyType" 类型。我有一个单独的xsd,根本没有链接在wsdl中,它描述了请求应该如何形成。
我想使用 zeep 实现 SOAP 请求以使用接口。我怎样才能让 zeep 知道那个(本地)xsd 文件?
我找到了 zeep.xsd.schema.SchemaDocument
class,但没有在任何地方使用它的例子。
有人可以给我一个使用示例,说明如何创建使用 wsdl 和单独的 xsd 文件的客户端吗?
是的,您可以通过以下方式向您的 zeep 客户端添加额外的模式:
import os
from zeep.loader import load_external
from zeep import Client
XSD_SCHEMA_FILE = "/path/to/your.xsd"
CONTAINER_DIR = os.path.dirname(XSD_SCHEMA_FILE) # Where to load dependencies if any
client = Client('https://path/to/your.wsdl')
schema_doc = load_external(open(XSD_SCHEMA_FILE, "rb"), None)
doc = client.wsdl.types.create_new_document(schema_doc, f"file://{CONTAINER_DIR}")
doc.resolve()
我需要实现一个 SPML 接口,它最终通过 HTTP(s) 执行 SOAP 请求。我有一个 wsdl 可以归结为:
<wsdl:types>
<schema targetNamespace="http://soapadapter.something" xmlns="http://www.w3.org/2001/XMLSchema">
<element name="receiveRequest" type="xsd:anyType"/>
</schema>
</wsdl:types>
[...]
<wsdl:operation name="receiveRequest">
<wsdl:input message="impl:receiveRequestRequest" name="receiveRequestRequest"/>
</wsdl:operation>
如您所见,唯一定义的请求元素是 "xsd:anyType" 类型。我有一个单独的xsd,根本没有链接在wsdl中,它描述了请求应该如何形成。
我想使用 zeep 实现 SOAP 请求以使用接口。我怎样才能让 zeep 知道那个(本地)xsd 文件?
我找到了 zeep.xsd.schema.SchemaDocument
class,但没有在任何地方使用它的例子。
有人可以给我一个使用示例,说明如何创建使用 wsdl 和单独的 xsd 文件的客户端吗?
是的,您可以通过以下方式向您的 zeep 客户端添加额外的模式:
import os
from zeep.loader import load_external
from zeep import Client
XSD_SCHEMA_FILE = "/path/to/your.xsd"
CONTAINER_DIR = os.path.dirname(XSD_SCHEMA_FILE) # Where to load dependencies if any
client = Client('https://path/to/your.wsdl')
schema_doc = load_external(open(XSD_SCHEMA_FILE, "rb"), None)
doc = client.wsdl.types.create_new_document(schema_doc, f"file://{CONTAINER_DIR}")
doc.resolve()