I need help to consume a XML string from a SOAP server and it's working with the data in first row (or parent nodes) but when I try to get data inside (child nodes) with two or more data, just get one. Maybe a loop will help me, but I can't figure it out how to do it. Here is a example of the response:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<PedidosDisponiveisResponse xmlns="http:...">
<PedidosDisponiveisResult>
<ResultadoOperacao>
<Codigo>200001</Codigo>
<Descricao>Operação "Selecionar os pedidos disponiveis na integração" efetuada com sucesso. - I35249DCD</Descricao>
<Tipo>tdreSucesso</Tipo>
</ResultadoOperacao>
<VersaoWebService>50.106.92.0</VersaoWebService>
<Rows>
<DadosPedidosDisponiveisWeb>
<CodigoPedidoAbacos>4967302</CodigoPedidoAbacos>
<NumeroDoPedido>2000007159352944</NumeroDoPedido>
<SequencialNumeroPedido>0</SequencialNumeroPedido>
<ProtocoloPedido>sdf-sdf</ProtocoloPedido>
<Comercializacao>MATRIZ - VENDA DE PRODUTOS OMNI </Comercializacao>
<GrupoComercializacao>VENDA </GrupoComercializacao>
<StatusPedido>DESPACHADO </StatusPedido>
<Acao>aieManutencao</Acao>
<PedidoWeb>
<ResultadoOperacao>
<Codigo>200001</Codigo>
<Descricao>Operação "Selecionar os dados do pedido que está disponivel na integração" efetuada com sucesso.</Descricao>
<Tipo>tdreSucesso</Tipo>
</ResultadoOperacao>
<Rows>
<DadosPedidoWeb>
<CodigoPedido>4902</CodigoPedido>
<NumeroPedido>20059352944</NumeroPedido>
<CodigoUnidadeNegocio>5</CodigoUnidadeNegocio>
<EMail>[email protected]</EMail>
<CodigoCliente>1082</CodigoCliente>
<ClienteCPFouCNPJ>99999999999</ClienteCPFouCNPJ>
<RepresentanteVendas>1</RepresentanteVendas>
<CodigoRepresentanteExterno>1</CodigoRepresentanteExterno>
<ValorPedido>99.8</ValorPedido>
<ValorFrete>71.07</ValorFrete>
<ValorEncargos>0</ValorEncargos>
<ValorDesconto>19900.2</ValorDesconto>
<DataVenda>654987 00:00:00.000</DataVenda>
<CodigoTransportadora>3</CodigoTransportadora>
<Transportadora>sdf</Transportadora>
<ServicoEntrega>sdf</ServicoEntrega>
<CodigoAdministrativoServicoEntrega>1510</CodigoAdministrativoServicoEntrega>
<TransportadoraCNPJ>987654321</TransportadoraCNPJ>
<Canal>OmniOne </Canal>
<SubCanal>Formigão </SubCanal>
<EmitirNotaSimbolica>N</EmitirNotaSimbolica>
<DataPrazoEntregaFinal />
<OptouNFPaulista>S</OptouNFPaulista>
<MensagemCorpoNota />
<DiasEntregaPosPagamento />
<DataPrazoEntrega>19012024 00:00:00.000</DataPrazoEntrega>
<DestNome>nononononononno</DestNome>
<DestEndereco>nononon</DestEndereco>
<DestEnderecoLogradouro>nononn</DestEnderecoLogradouro>
<DestEnderecoNumero>12654 </DestEnderecoNumero>
<DestEnderecoComplemento>Referencia:nonononono</DestEnderecoComplemento>
<DestBairro>sdfsdf</DestBairro>
<DestCep>987654</DestCep>
<DestMunicipio>sdf</DestMunicipio>
<DestEstado>sdf</DestEstado>
<DestPais>BRASIL </DestPais>
<DestSexo>E</DestSexo>
<DestEmail>sdf</DestEmail>
<DestTelefone>654</DestTelefone>
<DestTipoPessoa>F</DestTipoPessoa>
<DestCPFouCNPJ654987</DestCPFouCNPJ>
<DestInscricaoEstadual>sdf</DestInscricaoEstadual>
<DestInscricaoMunicipal />
<DestCodigoIBGE>54</DestCodigoIBGE>
<Anotacoes>
<ResultadoOperacao>
<Codigo>200001</Codigo>
<Descricao>Operação "Selecionar as anotações do pedido" efetuada com sucesso.</Descricao>
<Tipo>tdreSucesso</Tipo>
</ResultadoOperacao>
<Rows>
<DadosPedidoAnotacaoWeb>
<CodigoPedido>897</CodigoPedido>
<Anotacao>Frete: 0 Obs: collectorcollector paid,not_delivered,Dest: Felipe Demosthenes</Anotacao>
<DataAnotacao>654</DataAnotacao>
<ClassificacaoAnotacao>COMERCIAL </ClassificacaoAnotacao>
</DadosPedidoAnotacaoWeb>
<DadosPedidoAnotacaoWeb>
<CodigoPedido>8</CodigoPedido>
<Anotacao>sdf</Anotacao>
<DataAnotacao>15122023 12:20:25.507</DataAnotacao>
<ClassificacaoAnotacao>CRÉDITO </ClassificacaoAnotacao>
</DadosPedidoAnotacaoWeb>
</Rows>
</Anotacoes>
<EstoqueReservado>S</EstoqueReservado>
<PreVenda>Não</PreVenda>
<TipoFrete />
</DadosPedidoWeb>
</Rows>
</PedidoWeb>
<PedidoItens>
<ResultadoOperacao>
<Codigo>200001</Codigo>
<Descricao>Operação "Selecionar os dados dos itens do pedido que está disponivel na integração e com estoque reservado" efetuada com sucesso.</Descricao>
<Tipo>tdreSucesso</Tipo>
</ResultadoOperacao>
<Rows>
***# ** <DadosPedidoItensWeb>
# <CodigoItem>7</CodigoItem>
# <CodigoProdutoAbacos>1</CodigoProdutoAbacos>
# <CodigoProduto>1</CodigoProduto>
# <Quantidade>1</Quantidade>
# <PrecoUnitarioLiquido>49.9</PrecoUnitarioLiquido>
# <PrecoUnitarioBruto>10000</PrecoUnitarioBruto>
# <QuantidadeReservada>0</QuantidadeReservada>
# <PersonalizacaoNome />
# <PersonalizacaoTexto />
# <NomeProduto>Lente Farol Fiesta 03/07 Ld</NomeProduto>
# <NomeComposto>Lente Farol Fiesta 03/07 Ld * Direito Passageiro * GRUPO * CAMBUCI</NomeComposto>
# <CodigoBarras>654</CodigoBarras>
# <Classe>ACABADO </Classe>
# <TipoItem>NORMAL</TipoItem>
# <CodigoRastreabilidade />
# <DataValidade />
# <DataVencimentoGarantia />
# <PreVenda>Não</PreVenda>
# <Rastreabilidade>
# <ResultadoOperacao>
# <Codigo>200003</Codigo>
# <Descricao>OK, porém não há dados.</Descricao>
# <Tipo>tdreSucessoSemDados</Tipo>
# </ResultadoOperacao>
# </Rastreabilidade>
# </DadosPedidoItensWeb>
# <DadosPedidoItensWeb>
# <CodigoItem>5</CodigoItem>
# <CodigoProdutoAbacos>1</CodigoProdutoAbacos>
# <CodigoProduto>5</CodigoProduto>
# <Quantidade>1</Quantidade>
# <PrecoUnitarioLiquido>49.9</PrecoUnitarioLiquido>
# <PrecoUnitarioBruto>10000</PrecoUnitarioBruto>
# <QuantidadeReservada>0</QuantidadeReservada>
# <PersonalizacaoNome />
# <PersonalizacaoTexto />
# <NomeProduto>Lente Farol Fiesta 03/07 Le</NomeProduto>
# <NomeComposto>Lente Farol Fiesta 03/07 Le * Esquerdo Motorista * GRUPO * CAMBUCI</NomeComposto>
# <CodigoBarras>2</CodigoBarras>
# <Classe>ACABADO </Classe>
# <TipoItem>NORMAL</TipoItem>
# <CodigoRastreabilidade />
# <DataValidade />
# <DataVencimentoGarantia />
# <PreVenda>Não</PreVenda>
# <Rastreabilidade>
# <ResultadoOperacao>
# <Codigo>200003</Codigo>
# <Descricao>OK, porém não há dados.</Descricao>
# <Tipo>tdreSucessoSemDados</Tipo>
# </ResultadoOperacao>
# </Rastreabilidade>
# </DadosPedidoItensWeb>*****
</Rows>
</PedidoItens>
<PedidoPagamento>
<ResultadoOperacao>
<Codigo>200001</Codigo>
<Descricao>Operação "Selecionar os dados dos pagamentos do pedido que está disponivel na integração" efetuada com sucesso.</Descricao>
<Tipo>tdreSucesso</Tipo>
</ResultadoOperacao>
<Rows>
<DadosPedidoPagamentoWeb>
<CodigoPagamentoAbacos>1</CodigoPagamentoAbacos>
<FormaPagamentoCodigo>14</FormaPagamentoCodigo>
<FormaPagamento>sdf </FormaPagamento>
<TipoFormaPagamentoSigla>CA</TipoFormaPagamentoSigla>
<Valor>170.87</Valor>
<ValorPago>170.87</ValorPago>
<TIDGateway />
<Autorizacao />
<NSU />
<DataPagamento>15122023 00:00:00.000</DataPagamento>
<DataVencimentoBoleto>15122023 12:20:25.290</DataVencimentoBoleto>
<CondicaoPagamento />
<QuantidadeParcelasCartao>1</QuantidadeParcelasCartao>
<CMC7 />
<Parcelas>
<ResultadoOperacao>
<Codigo>200001</Codigo>
<Descricao>Operação "Parcelas dos pagamento com cartão" efetuada com sucesso.</Descricao>
<Tipo>tdreSucesso</Tipo>
</ResultadoOperacao>
<Rows>
<DadosPedidoPagamentoParcelasWeb>
<DataAprovacao>15122023</DataAprovacao>
<DataProvisaoPagamento>15122023</DataProvisaoPagamento>
<ValorBruto>170.87</ValorBruto>
<NumeroParcela>1</NumeroParcela>
<QuantidadeParcelas>1</QuantidadeParcelas>
<CodigoNSU />
<CodigoAutorizacao />
</DadosPedidoPagamentoParcelasWeb>
</Rows>
</Parcelas>
<PagamentoBoleto>
<ResultadoOperacao>
<Codigo>200003</Codigo>
<Descricao>OK, porém não há dados.</Descricao>
<Tipo>tdreSucessoSemDados</Tipo>
</ResultadoOperacao>
<Rows />
</PagamentoBoleto>
<CNPJCredenciadora>54</CNPJCredenciadora>
<Bandeira>99</Bandeira>
<ValorDescontoFinanceiro>0</ValorDescontoFinanceiro>
</DadosPedidoPagamentoWeb>
</Rows>
</PedidoPagamento>
<ProcessoTroca>
<ResultadoOperacao>
<Codigo>200003</Codigo>
<Descricao>OK, porém não há dados.</Descricao>
<Tipo>tdreSucessoSemDados</Tipo>
</ResultadoOperacao>
<Rows>
<DadosProcessoTrocaWeb>
<CodigoInternoNotaOrigem>0</CodigoInternoNotaOrigem>
<CodigoInternoPedidoOrigem>0</CodigoInternoPedidoOrigem>
<CodigoExternoPedidoOrigem />
</DadosProcessoTrocaWeb>
</Rows>
</ProcessoTroca>
</DadosPedidosDisponiveisWeb>
I need to get all two or more data inside DadosPedidoItensWeb.
Could anyone help me? I'm developing in Python with SQL Server.
Here is the my code:
import logging
import pyodbc
import requests
import xml.etree.ElementTree as ET
from io import StringIO
import datetime
def handle_soap_request(url: str, headers: dict, body: str, db_connection_string: str) -> None:
try:
response = requests.post(url, data=body, headers=headers)
response_content = response.content.decode("utf-8")
response_content = response_content.replace('�', '')
xml_io = StringIO(response_content)
for event, element in ET.iterparse(xml_io, events=("start", "end")):
if event == "start" and element.tag == '{http://www.kplsolucoes.com.br/ABACOSWebService}DadosPedidosDisponiveisWeb':
try:
codigoPedidoAbacos, numeroDoPedido, protocoloPedido, comercializacao, grupoComercializacao, codigoUnidadeNegocio, codigoCliente, valorPedido, valorFrete, valorEncargos, valorDesconto, dataVenda, codigoTransportadora, transportadora, servicoEntrega, transportadoraCNPJ, canal, subCanal, destCep, destMunicipio, destEstado, codigoProdutoAbacos, codigoProduto, precoUnitarioLiquido, precoUnitarioBruto, quantidadeReservada, nomeProduto, nomeComposto, codigoBarras, classe, codigoItem = (
element.findtext(f".//{{http://www.kplsolucoes.com.br/ABACOSWebService}}{tag}")
for tag in [
"CodigoPedidoAbacos",
"NumeroDoPedido",
"ProtocoloPedido",
"Comercializacao",
"GrupoComercializacao",
"CodigoUnidadeNegocio",
"CodigoCliente",
"ValorPedido",
"ValorFrete",
"ValorEncargos",
"ValorDesconto",
"DataVenda",
"CodigoTransportadora",
"Transportadora",
"ServicoEntrega",
"TransportadoraCNPJ",
"Canal",
"SubCanal",
"DestCep",
"DestMunicipio",
"DestEstado",
"CodigoProdutoAbacos",
"CodigoProduto",
"PrecoUnitarioLiquido",
"PrecoUnitarioBruto",
"QuantidadeReservada",
"NomeProduto",
"NomeComposto",
"CodigoBarras",
"Classe",
"CodigoItem"
]
)
except ET.ParseError as e:
logging.warning("Error processing row: %s", e)
continue
if dataVenda:
try:
dataVenda = datetime.datetime.strptime(dataVenda, '%d%m%Y %H:%M:%S.%f').strftime('%d/%m/%Y')
except ValueError as e:
logging.warning("Error processing date: %s", e)
# Primary key value does not exist, insert a new row
insert_new_row(cursor, codigoPedidoAbacos, numeroDoPedido, protocoloPedido, comercializacao, grupoComercializacao, codigoUnidadeNegocio, codigoCliente, valorPedido, valorFrete, valorEncargos, valorDesconto, dataVenda, codigoTransportadora, transportadora, servicoEntrega, transportadoraCNPJ, canal, subCanal, destCep, destMunicipio, destEstado, codigoProdutoAbacos, codigoProduto, precoUnitarioLiquido, precoUnitarioBruto, quantidadeReservada, nomeProduto, nomeComposto, codigoBarras, classe, codigoItem)
logging.info('New row ITEM inserted for CodigoItem: %s', codigoItem)
logging.info("Time: " + datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S"))
connection.commit()
element.clear()
except Exception as e:
logging.error('An error with occurred: %s', e)
pass
def insert_new_row(cursor, codigoPedidoAbacos, numeroDoPedido, protocoloPedido, comercializacao, grupoComercializacao, codigoUnidadeNegocio, codigoCliente, valorPedido, valorFrete, valorEncargos, valorDesconto, dataVenda, codigoTransportadora, transportadora, servicoEntrega, transportadoraCNPJ, canal, subCanal, destCep, destMunicipio, destEstado, codigoProdutoAbacos, codigoProduto, precoUnitarioLiquido, precoUnitarioBruto, quantidadeReservada, nomeProduto, nomeComposto, codigoBarras, classe, codigoItem):
if codigoItem is not None:
cursor.execute('INSERT INTO pedidosTeste ([CodigoPedidoAbacos], [NumeroDoPedido], [ProtocoloPedido], [Comercializacao], [GrupoComercializacao], [CodigoUnidadeNegocio], [CodigoCliente], [ValorPedido], [ValorFrete], [ValorEncargos], [ValorDesconto], [DataVenda], [CodigoTransportadora], [Transportadora], [ServicoEntrega], [TransportadoraCNPJ], [Canal], [SubCanal], [DestCep], [DestMunicipio], [DestEstado], [CodigoProdutoAbacos], [CodigoProduto], [PrecoUnitarioLiquido], [PrecoUnitarioBruto], [QuantidadeReservada], [NomeProduto], [NomeComposto], [CodigoBarras], [Classe], [CodigoItem]) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)',
(codigoPedidoAbacos, numeroDoPedido, protocoloPedido, comercializacao, grupoComercializacao, codigoUnidadeNegocio, codigoCliente, valorPedido, valorFrete, valorEncargos, valorDesconto, dataVenda, codigoTransportadora, transportadora, servicoEntrega, transportadoraCNPJ, canal, subCanal, destCep, destMunicipio, destEstado, codigoProdutoAbacos, codigoProduto, precoUnitarioLiquido, precoUnitarioBruto, quantidadeReservada, nomeProduto, nomeComposto, codigoBarras, classe, codigoItem))
else:
logging.warning("CodigoItem is None. Skipping row insertion.")
I have tried this way, but still getting one Item:
def handle_soap_request(url: str, headers: dict, body: str, db_connection_string: str) -> None: try: response = requests.post(url, data=body, headers=headers) response_content = response.content.decode("utf-8") response_content = response_content.replace('�', '')
xml_io = StringIO(response_content)
for event, element in ET.iterparse(xml_io, events=("start", "end")):
if event == "start" and element.tag.endswith("DadosPedidosDisponiveisWeb"):
try:
namespace = "{http://www.kplsolucoes.com.br/ABACOSWebService}"
codigoPedidoAbacos = element.findtext(f".//{namespace}CodigoPedidoAbacos")
numeroDoPedido = element.findtext(f".//{namespace}NumeroDoPedido")
codigoItem = element.findtext(f".//{namespace}CodigoItem")
protocoloPedido = element.findtext(f".//{namespace}ProtocoloPedido")
# Continue processing the data...
except ET.ParseError as e:
logging.warning("Error processing row: %s", e)
continue