Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Ler e alterar XML em Python

Fala galera, beleza? estou com uma duvida em leitura de XML em um formato diferente do padrão.

Tenho um programa que gera um banco de dados em XML no formato clientdataset (programação em delphi), ele possui uma estrutura diferente, quando ele é salvo por esse programa vem sem extensão do arquivo, ao abrir que verificamos que se tratava de um xml, queria percorrer esse xml no python podendo adicionar ou remover tags, atributos e elementos.

( com essas linhas de código consigo printar os atributos da tag ROW mas não seleciona-las)

import xml.etree.ElementTree as ET

tree = ET.parse('meuarquivo')
root = tree.getroot()

for child in root:
        for child1 in child:
            desc = child1.attrib
            print(desc)

segue exemplo desse arquivo :


<DATAPACKET Version="2.0">
    <METADATA>
            <FIELDS>
            <FIELD attrname="ID" fieldtype="i4" readonly="true" SUBTYPE="Autoinc"/>
            <FIELD attrname="CODICE" fieldtype="string" WIDTH="50"/>
            <FIELD attrname="NOTE" fieldtype="string" WIDTH="50"/>
            <FIELD attrname="RIM" fieldtype="boolean"/>
            <FIELD attrname="DX" fieldtype="r8"/>
            <FIELD attrname="DY" fieldtype="r8"/>
            <FIELD attrname="DZ" fieldtype="r8"/>
            <FIELD attrname="TIPO" fieldtype="string" WIDTH="20"/>
            <FIELD attrname="QTA" fieldtype="i4"/>
            <FIELD attrname="COSTOMQ" fieldtype="r8"/>
            <FIELD attrname="MATORG" fieldtype="string" WIDTH="50"/>
            <FIELD attrname="VENA" fieldtype="boolean"/>
            <FIELD attrname="COSTO" fieldtype="r8"/>
            <FIELD attrname="ONOFF" fieldtype="boolean"/>
            <FIELD attrname="COLORE" fieldtype="string" WIDTH="50"/>
            <FIELD attrname="QMIN" fieldtype="i4"/>
            </FIELDS>
        <PARAMS AUTOINCVALUE="41460451" DEFAULT_ORDER=""/>
    </METADATA>
    <ROWDATA>
        <ROW ID="41460447" CODICE="1005" NOTE="LAMINADO STD CRU" RIM="FALSE" DX="2200" DY="1600" DZ="4" TIPO="LAMINCRU4" QTA="0" COSTOMQ="0" MATORG="" VENA="FALSE" ONOFF="FALSE" COLORE="LAMINCRU" QMIN="0"/>
        <ROW ID="41460448" CODICE="1009" NOTE="MDF BP BCO DIAMANTE 2F" RIM="FALSE" DX="2745" DY="1830" DZ="6" TIPO="BCODIAMA6" QTA="0" COSTOMQ="0" MATORG="" VENA="FALSE" ONOFF="TRUE" COLORE="BCODIAMA" QMIN="0"/>
        <ROW ID="41460449" CODICE="R3383" NOTE="MDF BP SAL ROSA MATT" RIM="TRUE" DX="2746" DY="591,2" DZ="18" TIPO="SALROSAM18" QTA="1" COSTOMQ="0" MATORG="6314" VENA="FALSE" ONOFF="TRUE" COLORE="SALROSAM" QMIN="0"/>
        <ROW ID="41460450" CODICE="R3395" NOTE="MDF BP KASHMIR CHESS" RIM="TRUE" DX="512" DY="1830" DZ="25" TIPO="KASHMIRC25" QTA="1" COSTOMQ="0" MATORG="6354" VENA="FALSE" ONOFF="TRUE" COLORE="KASHMIRC" QMIN="0"/>
    </ROWDATA>
</DATAPACKET>
2 respostas
solução!

Olá, Luiz.

Tudo bem?

Entendo que você está tentando manipular um arquivo XML em Python. A biblioteca xml.etree.ElementTree é uma ótima escolha para isso.

No seu caso, você consegue imprimir os atributos da tag ROW, mas parece ter dificuldades em selecioná-las. Para selecionar as tags ROW, você pode usar a função findall() do ElementTree, que retorna uma lista de todos os elementos correspondentes à tag especificada.

Aqui está um exemplo de como você pode fazer isso:

import xml.etree.ElementTree as ET

tree = ET.parse('meuarquivo')
root = tree.getroot()

# Encontrar todas as tags ROW
rows = root.findall('.//ROW')

# Iterar sobre as tags ROW
for row in rows:
    # Imprimir os atributos da tag ROW
    print(row.attrib)
    
    # Para adicionar um atributo à tag ROW
    row.set('novo_atributo', 'valor do atributo')

    # Para remover um atributo da tag ROW
    row.attrib.pop('nome_do_atributo', None)

Nesse exemplo, './/ROW' é um XPath que seleciona todas as tags ROW no XML.

Para adicionar ou remover tags, atributos e elementos, você pode usar as funções set() e pop() do ElementTree. A função set() adiciona um atributo à tag especificada e a função pop() remove um atributo da tag especificada.

Espero ter ajudado e bons estudos!

Vlw Renan, era isso mesmo que eu precisava entender melhor !!! Muito obrigado