如何在Python中从SOAP响应XML获取Bearer Token
解决SOAP响应中读取Bearer Token的问题
你的代码失败主要是两个原因:XML命名空间未处理,还有代码里的import语法错误。下面给你修正后的解决方案:
问题分析
你拿到的SOAP XML包含两个命名空间:
soapenv: 对应http://schemas.xmlsoap.org/soap/envelope/ofo: 对应http://dummyurl.com/xsd/xyz
直接用find('Envelope/Body/GetToken/Token')找不到元素,因为这些标签都属于各自的命名空间;而且root本身就是<soapenv:Envelope>元素,路径里不需要再写Envelope。另外你代码里的import import lxml.etree是语法错误,要改成import lxml.etree。
修正后的代码
方法1:使用find并指定命名空间
import lxml.etree import requests # 发送请求获取响应 response = requests.post(url, data=body, headers=headers) root = lxml.etree.fromstring(response.content) # 定义命名空间映射 namespaces = { 'soapenv': 'http://schemas.xmlsoap.org/soap/envelope/', 'ofo': 'http://dummyurl.com/xsd/xyz' } # 从root(Envelope)开始定位Token元素 token_elem = root.find('soapenv:Body/ofo:GetToken/ofo:Token', namespaces=namespaces) if token_elem is not None: bearer_token = token_elem.text.strip() print(bearer_token) # 输出: Bearer 123sfafweo123 else: print("未找到Token元素")
方法2:使用XPath查询
XPath处理命名空间更灵活,适合复杂XML结构:
import lxml.etree import requests response = requests.post(url, data=body, headers=headers) root = lxml.etree.fromstring(response.content) namespaces = { 'soapenv': 'http://schemas.xmlsoap.org/soap/envelope/', 'ofo': 'http://dummyurl.com/xsd/xyz' } # 用XPath直接定位Token元素 token_elem = root.xpath('//ofo:Token', namespaces=namespaces)[0] bearer_token = token_elem.text.strip() print(bearer_token)
关键点说明
- 查询时必须指定命名空间映射,XML解析器才能识别带前缀的标签
root是<soapenv:Envelope>节点,路径从soapenv:Body开始即可- 记得检查元素是否存在,避免出现索引越界或None调用text属性的错误
内容的提问来源于stack exchange,提问作者user29496
相关产品推荐
相关产品推荐

