You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:10:00