如果zeep中为空,如何删除必需的wsdl字段

时间:2019-01-15 12:24:59

标签: python python-2.7 soap wsdl zeep

我正在使用zeep处理Python中的一些SOAP请求,并且遇到一种情况,我找不到任何文档(无论是关于SO还是它们的official docs )。

首先,我创建了一个factory

factory = client.type_factory('ns0')

factory的某些属性如下:

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.IctAdditionalInfositem中不包含任何数据时,我想得到:

<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实现此行为?

1 个答案:

答案 0 :(得分:0)

如果来自服务的响应始终返回强制性<item/>标记,则可以将响应作为参数传递给函数,该函数将删除空的<item/>标记并返回所需的xml。您在这里无法使用zeep做什么,因为zeep的API没有提供任何修改响应的功能。

实现上述目标的最佳方法是创建两个函数。第一个返回消息中的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) 库来解析xml。

<item/>

当我将带有空resolve_empty_xml_tag(xml_string)标签的xml字符串传递给xml = """<IctAdditionalInfos> <item/> </IctAdditionalInfos>""" print(resolve_empty_xml_tag(xml)) #Output <IctAdditionalInfos></IctAdditionalInfos> 函数时,我得到了所需的结果:

<item/>

当我传递带有xml = """<IctAdditionalInfos> <item>abc</item> </IctAdditionalInfos>""" print(resolve_empty_xml_tag(xml)) #Output <IctAdditionalInfos> <item>abc</item> </IctAdditionalInfos> 标签的xml字符串并包含一些数据时,我得到的是相同的xml字符串:

let a = [1,2,3,4,7,8,12,15,21,21,22,23]

let r = a.reduce((acc, val) => {
  const lastGroup = acc.pop() || [];
  const lastValue = lastGroup.slice(-1)[0];
  if (val - lastValue > 1) {
    return [...acc, lastGroup, [val]];    
  }
  return [...acc, [...lastGroup, val]];
}, []).map(group => {
  const first = group[0];
  const last = group[group.length-1];
  return first !== last ? `${first}-${last}` : `${first}`;
});

console.log(r)