我正在尝试使用Python库Zeep将CDATA标志传递给SOAP请求,但是Zeep忽略了具有CDATA的字段,因此搜索范围太广,返回的数据比我想要的大得多。不幸的是,以后再用熊猫子选择数据框是不可行的,否则一切都会好起来的。
该请求是针对SQL Server数据库的查询,我可以使用以下内容通过SOAP UI检索数据:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsc="some_domain.com">
<soapenv:Header/>
<soapenv:Body>
<wsc:search>
<arg0>
<userName>user</userName>
<password>pass</password>
<criteria>
<some_name>
<field_one>CS</field_one>
<date_field>>2019-04-22</date_field>
<![CDATA[<timestamp_field>>2019-04-22 00:00:00.000</timestamp_field>]]>
</some_name>
</criteria>
<maxRows>5</maxRows>
</arg0>
</wsc:search>
</soapenv:Body>
</soapenv:Envelope>
由于某种原因,日期字段可以正常工作,但时间戳要求使用CDATA,否则会出现错误。因此,我的问题是;我如何使用Zeep达到相同的目的?我认为这意味着我必须将CDATA标志传递到JSON中。
我已经阅读了SO,GitHub和Zeep文档,但是在任何地方都找不到将CDATA传递到Zeep或将CDATA标志传递到JSON(然后用于创建SOAP XML请求)的示例。
是否甚至可以将CDATA传递到JSON中?也许有人知道如何将我在上面显示的确切xml信封传递到Zeep(考虑到上面没有定义服务的WSDL URI)?
这里是完整的example script
然后... XML request and response
基本上,我设置了服务,为请求创建形成JSON,并将其传递到arg0下。
from zeep import Client
import zeep
from zeep.transports import Transport
searchTerm = 'ns0:metaWsSearchRequest'
wsdl_url = 'some_url'
XML_viewname = 'SOMENAME'
transport = Transport(timeout=600)
zeep_client = Client(wsdl=wsdl_url, transport=transport)
# I am looking for the correct way to structure this JSON request if I have to pass CDATA
find_criteria_filled = {
'userName': user,
'password': pwd,
'sessionId': None,
'criteria': {
'SOMENAME': {
'<![CDATA[some_column_name3]]>': '2019-04-22 00:00:00.000',
'some_column_name1': 'CS'
}
},
'maxRows': '1'
}
response = zeep_client.service.search(arg0=find_criteria_filled)
该请求最终省略了some_column_name3,因此搜索不正确。它不显示第22条记录,而是返回搜索“ some_column_name1”上的第一条记录:“ CS”,该记录的日期恰好为2019-04-25。
我没有运气尝试过这些组合:
'<![CDATA[some_column_name3]]>': '2019-04-22 00:00:00.000'
'![CDATA[some_column_name3]]': '2019-04-22 00:00:00.000'
'some_column_name3': '<![CDATA[2019-04-22 00:00:00.000]]>'
任何帮助将不胜感激。谢谢。