Python解析SOAP XML无法获取多个DadosPedidoItensWeb节点数据求助
解决SOAP响应中获取多条子节点数据的问题
场景1:使用标准库xml.etree.ElementTree解析XML
先确认你的SOAP响应XML结构(示例如下):
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <RetornaPedidoResponse xmlns="http://你的服务命名空间"> <DadosPedidoWeb> <NumeroPedido>12345</NumeroPedido> <DadosPedidoItensWeb> <ItemID>1</ItemID> <Produto>Camiseta</Produto> <Quantidade>2</Quantidade> </DadosPedidoItensWeb> <DadosPedidoItensWeb> <ItemID>2</ItemID> <Produto>Calça</Produto> <Quantidade>1</Quantidade> </DadosPedidoItensWeb> </DadosPedidoWeb> </RetornaPedidoResponse> </soap:Body> </soap:Envelope>
核心问题是你可能误用了find()(仅返回第一个匹配节点),正确做法是用findall()获取所有子节点,同时必须处理命名空间:
import xml.etree.ElementTree as ET # 替换为你的SOAP响应XML字符串 soap_response = """上述XML内容""" root = ET.fromstring(soap_response) # 定义命名空间映射,根据实际XML调整 namespaces = { 'soap': 'http://schemas.xmlsoap.org/soap/envelope/', 'ns': 'http://你的服务命名空间' } # 定位父节点 dados_pedido = root.find('.//ns:DadosPedidoWeb', namespaces=namespaces) # 获取所有DadosPedidoItensWeb子节点 itens = dados_pedido.findall('.//ns:DadosPedidoItensWeb', namespaces=namespaces) # 遍历处理每条子节点数据 for item in itens: item_id = item.find('ns:ItemID', namespaces=namespaces).text produto = item.find('ns:Produto', namespaces=namespaces).text quantidade = int(item.find('ns:Quantidade', namespaces=namespaces).text) # 插入SQL Server逻辑(示例用pyodbc) import pyodbc conn = pyodbc.connect( 'DRIVER={ODBC Driver 17 for SQL Server};SERVER=你的服务器地址;DATABASE=你的数据库;UID=用户名;PWD=密码' ) cursor = conn.cursor() cursor.execute(""" INSERT INTO PedidoItens (ItemID, Produto, Quantidade) VALUES (?, ?, ?) """, item_id, produto, quantidade) conn.commit() cursor.close() conn.close()
场景2:使用zeep库调用SOAP服务(更简便)
如果用zeep处理SOAP请求,它会自动将XML转换为Python对象,多子节点会被封装成列表,直接遍历即可:
from zeep import Client import pyodbc # 初始化SOAP客户端 client = Client('http://你的SOAP服务WSDL地址') # 调用目标方法,传入所需参数 response = client.service.RetornaPedido(参数1, 参数2) # 遍历所有子节点数据 for item in response.DadosPedidoWeb.DadosPedidoItensWeb: # 直接访问对象属性 item_id = item.ItemID produto = item.Produto quantidade = item.Quantidade # 插入SQL Server conn = pyodbc.connect( 'DRIVER={ODBC Driver 17 for SQL Server};SERVER=你的服务器地址;DATABASE=你的数据库;UID=用户名;PWD=密码' ) cursor = conn.cursor() cursor.execute(""" INSERT INTO PedidoItens (ItemID, Produto, Quantidade) VALUES (?, ?, ?) """, item_id, produto, quantidade) conn.commit() cursor.close() conn.close()
关键注意点
- 用
findall()替代find():前者返回所有匹配节点的列表,后者仅返回第一个。 - 命名空间必须正确:SOAP响应几乎都带命名空间,不指定会导致节点查找失败。
- zeep场景下不要直接取索引(如
[0]):多子节点本身就是列表,直接遍历即可。
内容的提问来源于stack exchange,提问作者Marcos Ribeiro
相关产品推荐
相关产品推荐

