python - 如果 zeep 中的强制 wsdl 字段为空,如何删除该字段

标签 python python-2.7 soap wsdl zeep

我正在使用zeep在Python中处理一些SOAP请求,我遇到了一种情况,我找不到任何文档(无论是在这里,在SO上,还是他们的 official docs )。

首先,我创建了一个工厂:

factory = client.type_factory('ns0')

这个工厂的一些属性如下所示:

In [76]: factory.IctAdditionalInfos()
Out[76]: 
{
    'item': []
}

item内我可以拥有以下数据:

In [79]: factory.IctAdditionalInfos(item={})
Out[79]: 
{
    'item': {
        'PersonId': None,
        'PersonIdExt': None,
        'Sex': None,
        'FirstName': None,
        'LastName': None,
        'Telephone': None,
        'MobilePhone': None,
        'Fax': None,
        'Email': None
    }
}

现在,我想要发生但我无法理解的事情是:

  • 当尝试构建并返回 XML,而不是使用

    将其发送到服务器时

    client.create_message(service, wsdl_interface_name, **self.data)

(self.data 包含 IctAdditionalInfos)并且当 factory.IctAdditionalInfos 不包含 item 中的任何数据时>,我想得到:

<IctAdditionalInfos></IctAdditionalInfos>

<IctAdditionalInfos/>

我得到的不是上面的内容:

<IctAdditionalInfos>
    <item/>
</IctAdditionalInfos>

因为item是强制性的。

IctIncidentAdditionalInfos 的 wsdl 定义如下所示:

<xsd:complexType name="IctIncidentAdditionalInfos">
  <xsd:sequence>
    <xsd:element name="item" type="IctIncidentAdditionalInfo" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>

如何使用 zeep 实现此行为?

最佳答案

如果服务的响应始终返回强制 <item/>标签,您可以将响应作为参数传递给删除空 <item/> 的函数。标记并返回所需的 xml。在这里您无法使用 zeep 做太多事情,因为他们的 API 不提供任何修改响应的功能。

实现上述目标的最佳方法是创建两个函数。第一个返回消息中的 xml 字符串,第二个扫描该字符串是否为空 <item/>标签。如果后者找到空标签,它将根据需要修改字符串,否则再次返回相同的 xml 字符串。我用过 lxml解析 xml 的库。

import lxml.etree as et

#retrieve xml string
def create_message():
    #your code here#
    node = client.create_message(service, wsdl_interface_name, **self.data)     
    return node

#resolve empty <item/> xml tags
def resolve_empty_xml_tag(xml_string):   
    tree = et.fromstring(xml_string)
    #traverse DOM for <item/> tag
    for elem in tree.xpath("//item"):
        #check for empty tag
        if elem.text is None:
            elem.getparent().remove(elem)
            new_xml = et.tostring(tree, pretty_print=True,encoding='unicode')
            new_xml_splitted = new_xml.split('\n')
            final_xml = [i.strip(' ') for i in new_xml_splitted if i is not '']
            return ''.join(final_xml)
    xml_string = et.tostring(tree, pretty_print=True,encoding='unicode')
    return xml_string

#function calls
node = create_message()
resolved_xml_string = resolve_empty_xml_tag(node)

#print to verify xml string
print(resolved_xml_string)

当我传递带有空 <item/> 的 xml 字符串时标记为resolve_empty_xml_tag(xml_string)函数,我得到了想要的结果:

xml = """<IctAdditionalInfos>
         <item/>
    </IctAdditionalInfos>"""
print(resolve_empty_xml_tag(xml))

#Output
<IctAdditionalInfos></IctAdditionalInfos>

当我传递带有 <item/> 的 xml 字符串时标签有一些数据,我得到相同的 xml 字符串:

xml = """<IctAdditionalInfos>
           <item>abc</item>
         </IctAdditionalInfos>"""
print(resolve_empty_xml_tag(xml))

#Output
<IctAdditionalInfos>
   <item>abc</item>
 </IctAdditionalInfos>

关于python - 如果 zeep 中的强制 wsdl 字段为空,如何删除该字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54198827/

相关文章:

python - Django 从 _meta.get_field 添加多对多关系

python - 如何在 Python 2 中运行随机函数

python - 如何导入一个位于上方两个目录和下方一个目录中的 Python 类?

python - 使用 Python 将 CSV 转换为 JSON(特定格式)

android - 使用 cxf 在 Android 设备上创建 web 服务?

java - 通过客户端发送到 SOAP Web 服务的对象大小是否有限制?

language-agnostic - 选择 Web 服务的方法

Python 2.7 如何在 "imp"导入的代码导入语句上欺骗 python

python - Pandas 在每组中找到满足条件的最大值

python - 无法在 Robotframework 中使用点符号访问字典