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节点因未检测到有效子元素而被忽略。
有两种可行的解决方式:
调整Zeep客户端配置
初始化客户端时开启非严格模式,让Zeep保留0.0这类数值的解析:from zeep import Client, Settings settings = Settings(strict=False) zeep_client = Client(你的WSDL地址, settings=settings)修改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
相关产品推荐
相关产品推荐

