I am a complete Python noob
现在预示已经完成,我试图从SOAP响应中解析一些信息。
响应的主体如下:
<soap:Body>
<ProcessMessageResponse xmlns="http://www.starstandards.org/webservices/2005/10/transport">
<payload>
<content id="Content0">
<CustomerLookupResponse xmlns="">
<Customer>
<CompanyNumber>ZQ1</CompanyNumber>
<CustomerNumber>1051012</CustomerNumber>
<TypeCode>I</TypeCode>
<LastName>NAME</LastName>
<FirstName>BASIC</FirstName>
<MiddleName/>
<Salutation/>
<Gender/>
<Language/>
<Address1/>
<Address2/>
<Address3/>
<City/>
<County/>
<StateCode/>
<ZipCode>0</ZipCode>
<PhoneNumber>0</PhoneNumber>
<BusinessPhone>0</BusinessPhone>
<BusinessExt>0</BusinessExt>
<FaxNumber>0</FaxNumber>
<BirthDate>0</BirthDate>
<DriversLicense/>
<Contact/>
<PreferredContact/>
<MailCode/>
<TaxExmptNumber/>
<AssignedSalesperson/>
<CustomerType/>
<PreferredPhone/>
<CellPhone>0</CellPhone>
<PagePhone>0</PagePhone>
<OtherPhone>0</OtherPhone>
<OtherPhoneDesc/>
<Email1/>
<Email2/>
<OptionalField/>
<AllowContactByPostal/>
<AllowContactByPhone/>
<AllowContactByEmail/>
<BusinessPhoneExtension/>
<InternationalBusinessPhone/>
<InternationalCellPhone/>
<ExternalCrossReferenceKey>0</ExternalCrossReferenceKey>
<InternationalFaxNumber/>
<InternationalOtherPhone/>
<InternationalHomePhone/>
<CustomerPreferredName/>
<InternationalPagerPhone/>
<PreferredLanguage/>
<LastChangeDate>20130401</LastChangeDate>
<Vehicles/>
<CCID/>
<CCCD>0</CCCD>
</Customer>
</CustomerLookupResponse>
</content>
</payload>
</ProcessMessageResponse>
</soap:Body>
我有以下代码片段来展示我为解析我想要的响应所做的工作:
customer_number = ''
customer_first_name = ''
customer_last_name = ''
def send_customer_lookup(data):
soap_action = 'http://www.starstandards.org/webservices/2005/10/transport/operations/ProcessMessage'
source_port = random.randint(6000, 20000)
webservice = httplib.HTTPSConnection('otqa.arkona.com', source_address=('', source_port))
webservice.putrequest('POST', '/OpenTrack/Webservice.asmx?wsdl')
webservice.putheader('User-Agent', 'OpenTrack-Heartbeat')
webservice.putheader('Content-Type', 'application/soap+xml')
webservice.putheader('Content-Length', '%d' % len(data))
webservice.putheader('SOAPAction', soap_action)
webservice.endheaders()
webservice.send(data)
response = webservice.getresponse()
response_xml = str(response.read())
doc = ET.fromstring(response_xml)
for customer in doc.findall('.//{http://www.starstandards.org/webservices/2005/10/transport}Payload'):
global customer_number
global customer_first_name
global customer_last_name
customer_number = customer.findtext('{http://www.starstandards.org/webservices/2005/10/transport}CustomerNumber')
customer_first_name = customer.findtext('{http://www.starstandards.org/webservices/2005/10/transport}FirstName')
customer_last_name = customer.findtext('{http://www.starstandards.org/webservices/2005/10/transport}LastName')
webservice.close()
return customer_number, customer_first_name, customer_last_name, response_xml
我不确定为什么我得到' ', ' ', ' ', <xml response>...
答案 0 :(得分:1)
您似乎过度指定了字段名称,因此它们与任何内容都不匹配,因此您的for customer in ...
永远不会运行。试试这个:
import httplib
import xml.etree.ElementTree as ET
def send_customer_lookup(data):
soap_action = 'http://www.starstandards.org/webservices/2005/10/transport/operations/ProcessMessage'
source_port = random.randint(6000, 20000)
with httplib.HTTPSConnection('otqa.arkona.com', source_address=('', source_port)) as webservice:
webservice.putrequest('POST', '/OpenTrack/Webservice.asmx?wsdl')
webservice.putheader('User-Agent', 'OpenTrack-Heartbeat')
webservice.putheader('Content-Type', 'application/soap+xml')
webservice.putheader('Content-Length', '%d' % len(data))
webservice.putheader('SOAPAction', soap_action)
webservice.endheaders()
webservice.send(data)
response_xml = str(webservice.getresponse().read())
doc = ET.fromstring(response_xml)
results = []
for customer in doc.findall('.//CustomerLookupResponse/'):
customer_number = customer.findtext('CustomerNumber')
customer_first_name = customer.findtext('FirstName')
customer_last_name = customer.findtext('LastName')
results.append((customer_number, customer_first_name, customer_last_name))
return results
此外,全局变量名称通常是邪恶的;我认为你添加了它们是因为你得到了'变量未定义'的错误?这应该是for循环实际上没有运行的线索。
答案 1 :(得分:0)
你可以使用xml.dom.minidom:
from xml.dom import minidom
def parse_customer_data(response_xml):
results = []
dom = minidom.parseString(response_xml)
customers=dom.getElementsByTagName('Customer')
for c in customers:
results.append({
"cnum" : c.getElementsByTagName('CustomerNumber')[0].firstChild.data,
"lname" : c.getElementsByTagName('LastName')[0].firstChild.data,
"fname" : c.getElementsByTagName('FirstName')[0].firstChild.data
})
return results
if __name__ == "__main__":
response_xml = open("soap.xml").read()
results = parse_customer_data(response_xml)
print(results)
请注意,对于输入文件,soap.xml: 1.我在您提供的XML周围添加了xml版本/ soap:Envelope元素,否则它将无法解析 2.我添加了另一个Customer元素来测试我的代码
输出:
$ python soap.py
[{'lname': u'NAME1', 'cnum': u'1051012', 'fname': u'BASIC1'}, {'lname': u'NAME2', 'cnum': u'1051013', 'fname': u'BASIC2'}]