You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Zeep解析XSD时0.0浮点数导致RateByRoom元素丢失问题咨询

问题描述

我在XSD中定义了如下复杂类型:

<xs:element name="RateByRoom">
    <xs:complexType>
        <xs:choice>
            <xs:element name="BuyingPrice" type="xs:double"/>
            <xs:element name="SellingPrice" type="xs:double"/>
        </xs:choice>
    </xs:complexType>
</xs:element>

解析包含BuyingPrice=0.0的XML时:

<HostingRate hosting_type_code="TEST_01:01">
    <RateByRoom>
      <BuyingPrice>0.0</BuyingPrice>
   </RateByRoom>
</HostingRate>

返回结果缺失了RateByRoom节点:

{
    'hosting_type_code': 'TEST_01:01',
    'length_of_stay': None
}

但将值改为1.0时,解析结果正常:

{
    'hosting_type_code': 'TEST_01:01',
    'length_of_stay': None,
    'RateByRoom': {
        'BuyingPrice': 1.0,
        'SellingPrice': None
    },
    'RatesByPax': None,
    'RatesByOccupancy': None
}

解析代码如下:

response_element: lxml.etree._Element = ...
InventoryUpdate = broker_client.zeep_client.get_element("ns0:InventoryUpdate")
inventory_update = InventoryUpdate.parse(response_element, zeep_client)

InventoryUpdate是WSDL中的顶层返回类型,HostingRate是其子节点。

请问这是项目特有问题,还是我遗漏了Zeep文档中的配置项?


解决方案

这不是项目特有问题,是Zeep的默认解析行为导致的:Zeep会把xs:double类型的0.0判定为无意义的默认值,在xs:choice结构下,会跳过该元素的解析,进而导致整个RateByRoom节点因未检测到有效子元素而被忽略。

有两种可行的解决方式:

  1. 调整Zeep客户端配置
    初始化客户端时开启非严格模式,让Zeep保留0.0这类数值的解析:

    from zeep import Client, Settings
    
    settings = Settings(strict=False)
    zeep_client = Client(你的WSDL地址, settings=settings)
    
  2. 修改XSD定义
    给BuyingPrice和SellingPrice添加nillable="true"属性,明确标记元素可空,让Zeep正确识别0.0为有效数值:

    <xs:element name="BuyingPrice" type="xs:double" nillable="true"/>
    <xs:element name="SellingPrice" type="xs:double" nillable="true"/>
    

如果无法修改XSD或客户端全局配置,也可以手动遍历XML节点,将0.0对应的元素手动补充到解析结果中,但这种方式维护成本较高,不推荐。


内容的提问来源于stack exchange,提问作者Martin Lehoux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:53:20