用zeep/python创建XML序列

2024-10-01 17:33:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用zeep(python3.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如下所示:

^{pr2}$

我第一次尝试用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来实现这一点,但还没有成功。在

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


Tags: pathnameapielementsoapxsdsequencexs
1条回答
网友
1楼 · 发布于 2024-10-01 17:33:43

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

这个问题的根源是我试图创建的XML元素没有被soapapi的WSDL显式定义为类型。不过,这没关系,因为Zeep仍然会为它生成类型对象,它只是不会将这些类型指定给一个特定的名称,所以我们必须通过一些额外的步骤来获得这些类型。这是我花了一点时间才弄明白的。在

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

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

这里,我们将elements对象转换为dict(利用它是一个2元组的列表,其中第一项是属性名的字符串),然后按名称拉出元素。在

生成的对象可以直接传递到ParentType,如下所示:

^{pr2}$

简单。在

我发现的另一个替代方法是使用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")
)

我想这不是很好,但可能对降落在这里的人有用。在

相关问题 更多 >

    热门问题