如何使用Python请求发送XML ElementTree?

时间:2017-10-30 16:55:13

标签: python xml python-requests elementtree

我想使用Python 3 Requests库发送XML POST请求。

当我将XML主体创建为纯文本字符串时,我能够send XML bytes to the server没有任何问题。但是,如果我将请求作为ElementTree.Element发送,服务器将回复错误消息“文件过早结束”。

将XML写为明文(有效)

import requests

root = """<?xml version = '1.0'?>
          <Kronos_WFC version = '1.0'> </Kronos_WFC>"""
headers = {'Content-Type': 'text/xml'}
print(requests.post('http://localhost/wfc/XmlService', data=root, headers=headers)).text

# Output:
# <Kronos_WFC version="1.0" WFCVersion="6.3.13.362" TimeStamp="10/30/2017 12:19PM GMT-04:00"></Kronos_WFC>

使用ElementTree构建XML(失败)

from xml.etree import ElementTree as ET
import requests

root = ET.Element("Kronos_WFC", version="1.0")
headers = {'Content-Type': 'text/xml'}
print(requests.post('http://localhost/wfc/XmlService', data=root, headers=headers)).text

# Output:
# <Kronos_WFC>
#    <Response Status="Failure" ErrorCode="-1" Message="Premature end of file.">
#    </Response></Kronos_WFC>

当我尝试打印我的XML ElementTree进行调试时,我发现Python将其解释为对象,而不是可解析的文本。我怀疑这可能是问题的原因。

root = ET.Element("Kronos_WFC", version="1.0")
print(root)

# Output:
# <Element 'Kronos_WFC' at 0x013492D0>

理想情况下,我想使用ElementTree.Element构建XML POST请求,然后使用请求将其发送到API。

如何使用Python请求将XML ElementTree.Element发送到服务器?

1 个答案:

答案 0 :(得分:1)

使用ElementTree.tostring()创建xml的字符串表示形式。

requests.post(
    'http://localhost/wfc/XmlService', 
    data=ET.tostring(root), 
    headers=headers
)