我正在使用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/