回答我自己的问题,因为我现在已经解决了它,并且没有收到任何其他答案。
这个问题的根源是我试图创建未由 SOAP API 的 WSDL 显式定义为类型的 XML 元素。不过这没关系,因为 Zeep 仍然会为其生成类型对象,只是不会将这些类型分配给特定名称,因此我们必须跳过一些额外的步骤才能获得这些类型。这就是我花了一点时间才弄清楚的。
您可以通过任何父类型访问这些对象来获取它们。它们存储在名为的属性中elements
作为 2 元组的列表。在这种情况下,我的PassengerType
对象应该包含在属性名称为“passengers”的序列容器中。例如,如果我的父类型名为ParentType
,我可以像这样使用这个“乘客”序列:
passengers = dict(ParentType.elements)['passengers'](
PassengerType(),
...
PassengerType()
)
在这里,我们将 elements 对象转换为一个字典(利用它是一个 2 元组列表,其中第一项是属性名称的字符串),然后按名称拉出元素。
生成的对象可以直接传递到ParentType
like:
ParentType(passengers=passengers)
Simple.
我发现的另一种选择是使用 zeep 显式构建类型xsd
对象。示例如下所示。
from lxml import etree
from zeep import xsd
PassengersType = xsd.ComplexType(
xsd.Sequence([
xsd.Element('passengers', PassengerType, min_occurs=1, max_occurs='unbounded')
]), qname=etree.QName("{http://example.com/schema}passengers")
)
我认为这不太好,但可能对登陆这里的人有用。