使用 zeep / python 创建 XML 序列

2024-04-14

我正在使用 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来实现这个目标,但还没有成功。

任何建议,将不胜感激。


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

这个问题的根源是我试图创建未由 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")
)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 zeep / python 创建 XML 序列 的相关文章

随机推荐

  • 是否还能获取Skype用户的在线状态?

    正如标题所说 API 服务发生 重大 变化后 是否仍然可以在 Skype 上查看用户的状态 在线 离线 忙碌 开发者部分现在看起来非常非常有限 http developer skype com http developer skype co
  • 从类库项目中的 App.config 读取

    我正在开发一个简单的类库项目 这会给我一个 dll 我想从配置文件中读取特定值 所以我在我的项目中添加了一个 App config 文件
  • 为什么 Linux/gnu 链接器选择地址 0x400000?

    我正在 Linux x86 64 上试验 ELF 可执行文件和 gnu 工具链 我已经链接并剥离 手动 Hello World 测试 global start text start mov 1 rax 转换为 267 字节 ELF64 可执
  • “&”和 std::reference_wrapper 之间的区别?

    我有以下代码 include
  • 开放固件设备树概述/参考手册

    我正在尝试为嵌入式 PowerPC 板设置驱动程序 今天执行此操作的正确方法是使用 OpenFirmware 设备树数据结构 dtb 文件 从 dts 文件编译 创建树非常简单 但是如何让我的设备驱动程序找到它的节点和其中的数据 我还没有找
  • 在棒棒糖之前的设备工具栏上添加标高/阴影

    我将我的 Android 应用程序更新为新的材料设计 但我还想向工具栏添加一些阴影或高度 似乎有一些 hacky 方法可以通过 images 9 patches 来完成此操作 但我想知道是否可以通过支持库来完成 就像CardView可以有海
  • 如何使用 Moq 对不同参数设置两次方法

    我想用最小起订量设置一个方法两次 但似乎最后一个方法覆盖了前面的方法 这是我的初始设置 string username foo string password bar var principal new GenericPrincipal n
  • Redux 表单中 中的 className

    我创建了一个 redux form 我想将 className 添加到每个字段以使用 css 自定义它们 每个字段的代码是
  • Android Google 日历“无法启动活动”

    Case 1我主持了 iCal 日历活动 icsAmazon AWS 上的文件及其 HTTP URL 集成在我的 Android 应用程序中 这是文件 https s3 ap southeast 1 amazonaws com endcar
  • 使不同纵横比的响应图像具有相同的高度

    我正在尝试找出一种方法 使响应式图像行具有相同的高度 而不管每个图像的纵横比或容器的宽度如何 实际图像文件的高度相同 但宽度不同 问题是 当容器变小时 在某些宽度下 舍入误差会导致图像的高度相差一个或两个像素 这是一个小提琴http jsf
  • 如何向导航栏添加阴影而不是默认边框

    我想替换默认边框UINavigationBar与阴影 有什么办法可以实现这一点吗 我尝试使用与向 UIView 添加阴影相同的方法 但它增加了导航栏的高度 尝试这个 self navigationController navigationB
  • Angular2创建一个显示外部网页内容的组件

    我需要创建一个显示另一个网页内容的组件 例如 如果我有 stackoverflow 站点 我想创建一个组件来执行 http 请求并通过我的应用程序显示内容 顺便说一下 外部网站只是 django rest swagger 要访问它 我每次访
  • 在 Rails 应用程序中使用自定义函数

    我试图遵循以下关于在 Rails 中使用自定义函数的答案中的简短示例 http stackoverflow com questions 2879679 where to put code snippets in rails 在 lib ma
  • SQL查询大约需要10 - 20分钟

    我有一个选择 没什么复杂的 Select from VIEW 该视图大约有 6000 条记录和大约 40 列 它来自 Lotus Notes SQL 数据库 所以我的 ODBC 驱动程序是 LotusNotesSQL 驱动程序 执行该查询大
  • 如何防止触摸空格键时键盘从数字变为字母?

    I have UITextFields在表格上输入值 其中一些字段只接受数字 我在用UIKeyboardTypeNumbersAndPunctuation对于键盘类型 以及shouldChangeCharactersInRange来过滤字符
  • git 我可以加快提交速度吗?

    我在共享文件夹中有一个大存储库 我在该文件夹的虚拟机中使用 git 一切都很好 但存储库很大 git 正在搜索所有目录和文件 当提交缓慢时 我无法将此存储库移出共享文件夹 我尝试过了git add特定文件和目录 但当我这样做时git com
  • 带有通配符的主干事件

    有没有办法监听命名空间的所有事件 所以当我听到这样的事件时 app vent on notification id function type console lof type 它将监听所有这样的事件 app vent trigger no
  • JavaScript - myArray.forEach 与 for 循环的细微差别

    我看到很多建议使用的问题 for var i 0 i lt myArray length i 代替 for var i in myArray 对于数组 由于迭代不一致 see here https stackoverflow com que
  • 在汇编程序中将十进制转换为二进制

    我的第一个汇编程序需要帮助 我必须将用户输入的值从十进制转换为二进制 我不知道如何将值显示为小数 以及下一步应该做什么 谁能一步一步指导我下一步做什么 model small stack 100h data txt1 db Enter bi
  • 使用 zeep / python 创建 XML 序列

    我正在使用 zeep Python 3 6 与 SOAP API 进行交互 并使用包含此部分的 WSDL 架构