Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Como reformatar um xml utilizando python e pegar um dado de uma tag?

Olá! Tenho um xml de exemplo e preciso adicionar uma tag e inserir dentro dessa tag um id, o mesmo utilizado no <idLote>200602220000001</idLote>

xml = '<?xml version="1.0" encoding="UTF-8"?>
<enviCTe xmlns="http://www.portalfiscal.inf.br/cte" versao="3.00">
 <idLote>200602220000001</idLote>
 <CTe xmlns="http://www.portalfiscal.inf.br/cte">
 <infCte Id="CTe41100600242640000108570000000446060832911308" versao="3.00"><Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
</CTe> <CTe xmlns="http://www.portalfiscal.inf.br/cte"> <infCte Id="CTe41100600242640000108570000000446060832911308" versao="3.00"> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> </CTe></enviCTe>'

Pensei em fazer algo assim:

id_do_xml = <id>{}</id>

e

xml = '<?xml version="1.0" encoding="UTF-8"?>
<enviCTe xmlns="http://www.portalfiscal.inf.br/cte" versao="3.00">
 <idLote>200602220000001</idLote>
 <CTe xmlns="http://www.portalfiscal.inf.br/cte">
 <infCte Id="CTe41100600242640000108570000000446060832911308" versao="3.00"><Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
</CTe> <CTe xmlns="http://www.portalfiscal.inf.br/cte"> <infCte Id="CTe41100600242640000108570000000446060832911308" versao="3.00"> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> </CTe></enviCTe>'

Eu eu concatenaria essas duas variáveis, porém não estou conseguindo inserir o id... A ideia é que o resultado final fique:

xml_com_id = id_do_xml+ 200602220000001 que é o número localizado no <idLote> da variável xml .

E então seria... xml_completo = xml_com_id + xml

xml_completo = <id>200602220000001</id><?xml version="1.0" encoding="UTF-8"?>
<enviCTe xmlns="http://www.portalfiscal.inf.br/cte" versao="3.00">
 <idLote>200602220000001</idLote>
 <CTe xmlns="http://www.portalfiscal.inf.br/cte">
 <infCte Id="CTe41100600242640000108570000000446060832911308" versao="3.00"><Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
</CTe> <CTe xmlns="http://www.portalfiscal.inf.br/cte"> <infCte Id="CTe41100600242640000108570000000446060832911308" versao="3.00"> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> </CTe></enviCTe>

Agradeço a ajuda!

1 resposta
solução!

Oiii Yara, como você está? Espero que esteja bem ^-^

Podemos utilizar uma regex para capturar o idLote. O nosso padrão será dado pela seguinte expressão:

<idLote>(\d+)<\/idLote>

Nesse caso, dizemos que iremos procurar no texto por algo que comece com a tag <idLote>, possua uma ou mais ocorrências de números e termine com <\idLote>. Como a barra é um símbolo utilizado no regex e possui outros significados, tivemos que escapá-la utilizando uma barra invertida para que a mesma fosse utilizada no sentido literal. Detalhe: utilizamos os parênteses ao redor do "\d"(representa números) para conseguirmos capturar apenas os números. E o símbolo de "+" nos diz que poderemos ter uma ou mais ocorrências de números entre a tag idLote.

Com isso, o nosso código fica da seguinte maneira:

import re


xml = """<?xml version="1.0" encoding="UTF-8"?>
<enviCTe xmlns="http://www.portalfiscal.inf.br/cte" versao="3.00">
 <idLote>200602220000001</idLote>
 <CTe xmlns="http://www.portalfiscal.inf.br/cte">
 <infCte Id="CTe41100600242640000108570000000446060832911308" versao="3.00"><Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
</CTe> <CTe xmlns="http://www.portalfiscal.inf.br/cte"> <infCte Id="CTe41100600242640000108570000000446060832911308" versao="3.00"> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> </CTe></enviCTe>"""


id_lote = x = re.search("<idLote>(\d+)<\/idLote>", xml)
id_lote = id_lote.group(1) # capturando apenas os números

xml_com_id = f"<id>{id_lote}</id>"

xml_completo = xml_com_id + xml

print(xml_completo)

Resultado:

<id>200602220000001</id><?xml version="1.0" encoding="UTF-8"?>
<enviCTe xmlns="http://www.portalfiscal.inf.br/cte" versao="3.00">
 <idLote>200602220000001</idLote>
 <CTe xmlns="http://www.portalfiscal.inf.br/cte">
 <infCte Id="CTe41100600242640000108570000000446060832911308" versao="3.00"><Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
</CTe> <CTe xmlns="http://www.portalfiscal.inf.br/cte"> <infCte Id="CTe41100600242640000108570000000446060832911308" versao="3.00"> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> </CTe></enviCTe>

Qualquer dúvida estou por aqui.

Abraços e bons estudos!