Как разместить элемент XML в Python - PullRequest
12 голосов
/ 24 июня 2010

В основном у меня есть этот элемент xml (xml.etree.ElementTree), и я хочу разместить его в URL. В настоящее время я делаю что-то вроде

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

Я почти уверен, что это работает и все такое, но мне было интересно, есть ли какая-нибудь лучшая практика или способ сделать это без предварительного преобразования в строку.

Спасибо!

Ответы [ 3 ]

17 голосов
/ 24 июня 2010

Если это ваш собственный API, я бы рассмотрел POSTing как 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)
1 голос
/ 26 сентября 2013

Вот полный пример (фрагмент) для отправки почтовых данных (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 голосов
/ 24 июня 2010

Нет, я думаю, что это, вероятно, лучший способ сделать это - это коротко и просто, что еще можно попросить?Очевидно, что в какой-то момент XML должен быть преобразован в строку, и если вы не используете библиотеку XML со встроенной поддержкой POST для URL (что не xml.etree), вам придется сделать это самостоятельно.1002 *

...