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