我正在使用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.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
实现此行为?
答案 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)