2010-06-24 54 views
12

基本上我有这个xml元素(xml.etree.ElementTree),我想将它发布到一个url。目前我正在做这样的事情如何在python中发布xml元素

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

我敢肯定,作品和所有的,但不知道是否有一些更好的做法或方法来做到这一点,而不首先将其转换为一个字符串。

谢谢!

+0

使用Python [发布XML文件的可能的复制](https://stackoverflow.com/questions/16192638/post-xml-file-using-python) – 2017-10-17 13:35:49

回答

16

如果这是您自己的API,我会考虑POST为application/xml。默认值为application/x-www-form-urlencoded,这是为HTML表单数据而非单个XML文档。

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

请注意,您不必构建开门红。你可以简单地调用'urllib2.urlopen(req)' - urlopen可以接受Request对象以及普通的URL字符串。 – 2010-06-24 00:51:15

+0

谢谢,@Walter。 – 2010-06-24 00:57:29

0

不,我认为这可能是最好的方式 - 它很简单,你还能要求什么?很明显,XML必须在某个时刻转换为字符串,除非您使用内置支持的XML库来发布到URL(不是xml.etree),您必须自己动手。

1

这里是POST数据(XML)发送到一个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 

最后:

return xml_output 
+0

请改善你的格式。 – pinckerman 2013-09-25 20:56:22