python - 使用 zeep/python 创建 XML 序列

标签 python soap xsd wsdl zeep

我正在使用 zeep (Python 3.6) 与 SOAP API 交互,并使用包含此部分的 WSDL 模式:

<xs:element name="passengers">
    <xs:complexType>
        <xs:sequence>
            <xs:element maxOccurs="unbounded" name="passenger" type="com:PassengerType"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

所以我希望我的 zeep 生成的 XML 看起来像这样:

<book:passengers>
    <book:passenger>
        ...redacted...
    </book:passenger>
</book:passengers>

我第一次尝试用 Zeep 实现这个目标是这样的:

passengers = [factories.PassengerType()]

但是,当将它发送到我的 SOAP API 时,会产生以下错误:

File "/usr/local/lib/python3.6/site-packages/zeep/xsd/elements/element.py", line 220, in validate
  "Missing element %s" % (self.name), path=render_path)
zeep.exceptions.ValidationError: Missing element passenger (createBookingRecordRequest.passengers)

我相信这是因为我的“passengers”属性应该包含一个带有标签名称“passenger”的 Zeep 对象,它将包含我的元素列表。我曾尝试修改 zeep.xsd.AnyType 来实现此目的,但尚未成功。

如有任何建议,我们将不胜感激。

最佳答案

回答我自己的问题,因为我现在已经解决了它,并且没有收到任何其他答案。

此问题的根源在于我试图创建的 XML 元素未被我的 SOAP API 的 WSDL 明确定义为类型。但这没关系,因为 Zeep 仍会为其生成类型对象,它只是不会将这些类型分配给特定名称,因此我们必须跳过一些额外的环节才能获得这些类型。这是我花了一点时间才弄明白的。

您可以通过任何父类型访问这些对象来获取它们。它们作为二元组列表存储在名为 elements 的属性中。在这种情况下,我的 PassengerType 对象应该包含在属性名称为“passengers”的序列容器中。例如,如果我的父类型名为 ParentType,我可以像这样使用这个“乘客”序列:

passengers = dict(ParentType.elements)['passengers'](
    PassengerType(),
    ...
    PassengerType()
)

在这里,我们将元素对象转换为一个字典(利用它是一个二元组列表的事实,其中第一项是属性名称的字符串),然后按名称提取元素。

结果对象可以直接传递到 ParentType 中,例如:

ParentType(passengers=passengers)

简单。

我发现的另一种选择是使用 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")
)

我认为这不是很好,但可能对登陆这里的人有用。

关于python - 使用 zeep/python 创建 XML 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44658401/

相关文章:

python - 不规则时间序列上的 Pandas 滑动/滚动窗口

python - 无法导入模块 - 为什么 sys.path 找不到 PYTHONPATH?

python - 使用装饰器检查可选参数

python - 正则表达式自动在函数输入上运行?

Java SOAP 请求

php - 第一次数据支付网关集成soap故障报错

php - 提供股票市场信息的网络服务

java - 解码、xml 到 java、XSD 中未定义的无效枚举值被忽略

java - 添加指向 REST 响应的链接

c# - xmlserializer 验证