2010-06-24 2 views
12

Fondamentalmente ho questo elemento xml (xml.etree.ElementTree) e voglio POSTlo in un url. Attualmente sto facendo qualcosa di simileCome POST un elemento xml in python

xml_string = xml.etree.ElementTree.tostring(my_element) 
data = urllib.urlencode({'xml': xml_string}) 
response = urllib2.urlopen(url, data) 

Sono abbastanza sicuro che le opere e tutto, ma chiedevo se c'è qualche pratica o meglio modo per farlo senza convertirlo in una stringa prima.

Grazie!

+0

Possibile duplicato del [file XML Post con Python ] (https://stackoverflow.com/questions/16192638/post-xml-file-using-python) –

risposta

16

Se questa è la propria API, prenderei in considerazione il POSTing come application/xml. Il valore predefinito è application/x-www-form-urlencoded, che è inteso per i dati del modulo HTML, non un singolo documento XML.

req = urllib2.Request(url=url, 
         data=xml_string, 
         headers={'Content-Type': 'application/xml'}) 
urllib2.urlopen(req) 
+0

Si noti che non è necessario creare l'apertura. Puoi semplicemente chiamare 'urllib2.urlopen (req)' - urlopen può accettare oggetti Request e stringhe URL semplici. –

+0

Grazie, @Walter. –

0

No, penso che sia probabilmente il modo migliore per farlo - è breve e semplice, cosa si può chiedere di più? Ovviamente l'XML deve essere convertito in una stringa a un certo punto e, a meno che non si stia utilizzando una libreria XML con supporto integrato per il POST a un URL (che non è lo standard), è necessario farlo da soli.

1

Ecco un esempio completo (frammento) per l'invio di dati post (XML) a un URL:

def execQualysAction(username,password,url,request_data): 
    import urllib,urrlib2 
    xml_output = None 
    try: 
    base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '') 
    headers = {'X-Requested-With' : 'urllib2','Content-Type': 'application/xml','Authorization': 'Basic %s' % base64string} 
    req = urllib2.Request(url=url,data=request_data,headers=headers) 
    response = urllib2.urlopen(req,timeout=int(TIMEOUT)) 
    xml_output = response.read() 
    if args.verbose>1: 
     print "Result of executing action request",request_data,"is:",xml_output 
    except: 
    xml_output = '<RESULT></RESULT>' 
    traceback.print_exc(file=sys.stdout) 
    print '-'*60 

infine:

return xml_output 
+0

Per favore, migliora la tua formattazione. – pinckerman