Métodos de Análise XML em Python: ElementTree, DOM e SAX

Python oferece três abordagens distintas para processar documentos XML: SAX, DOM e ElementTree:

  • SAX: Utiliza um modelo orientado a eventos baseado em callbacks definidos pelo usuário para processar arquivos XML.
  • DOM: Carrega os dados XML na memória como uma estrutura de árvore manipulável.
  • ElementTree: Oferece uma API leve semelhante ao DOM com melhor usabilidade, velocidade e menor consumo de memória.

Implementação com SAX

O SAX opera com um modelo baseado em eventos que envolve dois componentes principais: o analisador e o manipulador de eventos.

class FilmeHandler(xml.sax.ContentHandler): def init(self): self.dado_atual = "" self.categoria = "" self.modelo = "" self.lancamento = "" self.classificacao = "" self.pontuacao = "" self.resumo = ""

def startElement(self, etiqueta, atributos):
    self.dado_atual = etiqueta
    if etiqueta == "filme":
        print("=== Informações do Filme ===")
        titulo = atributos["titulo"]
        print("Título:", titulo)

def endElement(self, etiqueta):
    if self.dado_atual == "categoria":
        print("Gênero:", self.categoria)
    elif self.dado_atual == "modelo":
        print("Suporte:", self.modelo)
    elif self.dado_atual == "lancamento":
        print("Ano:", self.lancamento)
    elif self.dado_atual == "classificacao":
        print("Classificação:", self.classificacao)
    elif self.dado_atual == "pontuacao":
        print("Avaliação:", self.pontuacao)
    elif self.dado_atual == "resumo":
        print("Sinopse:", self.resumo, "\n")
    self.dado_atual = ""

def characters(self, conteudo):
    if self.dado_atual == "categoria":
        self.categoria = conteudo
    elif self.dado_atual == "modelo":
        self.modelo = conteudo
    elif self.dado_atual == "lancamento":
        self.lancamento = conteudo
    elif self.dado_atual == "classificacao":
        self.classificacao = conteudo
    elif self.dado_atual == "pontuacao":
        self.pontuacao = conteudo
    elif self.dado_atual == "resumo":
        self.resumo = conteudo

if name == "main": leitor_xml = xml.sax.make_parser() leitor_xml.setFeature(xml.sax.handler.feature_namespaces, 0)

manipulador = FilmeHandler()
leitor_xml.setContentHandler(manipulador)

leitor_xml.parse("catalogo_filmes.xml")

</div>Estrutura XML Exemplo
---------------------

<div class="code-block">```
<colecao prateleira="destaques">
<filme titulo="De Volta aos 20">
   <categoria>Comédia, Família, Fantasia</categoria>
   <modelo>DVD</modelo>
   <lancamento>2014</lancamento>
   <classificacao>Livre</classificacao>
   <pontuacao>8</pontuacao>
   <resumo>Uma avó idosa se transforma misteriosamente em jovem adulta</resumo>
</filme>
<filme titulo="The Wandering Earth">
   <categoria>Ficção Científica, Aventura</categoria>
   <modelo>DVD</modelo>
   <lancamento>2019</lancamento>
   <classificacao>14 anos</classificacao>
   <pontuacao>9</pontuacao>
   <resumo>Humanidade tenta salvar a Terra da destruição solar</resumo>
</filme>
</colecao>

A abordagem DOM permite navegar pela estrutura XML como uma árvore de nós:


</div>Trabalhando com ElementTree
---------------------------

ElementTree fornece uma interface mais intuitiva para manipular XML:

<div class="code-block">```
print(type(elemento_xml))  # <class 'xml.etree.ElementTree.Element'>
print(elemento_xml.text)      # Conteúdo textual
print(elemento_xml.attrib)    # Dicionário de atributos
print(elemento_xml.tag)       # Nome da etiqueta

Tags: Python XML parsing SAX DOM

Publicado em 8-19 03:10