为什么我得不到正确答案?

时间:2014-02-05 23:45:00

标签: python xml web-services soap

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>...

的输出

2 个答案:

答案 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'}]
相关问题