Skip to content

Instantly share code, notes, and snippets.

@rscarvalho
Created January 7, 2018 16:59
Show Gist options
  • Save rscarvalho/6f6192199c0adbc0b37b1ec50047ac0b to your computer and use it in GitHub Desktop.
Save rscarvalho/6f6192199c0adbc0b37b1ec50047ac0b to your computer and use it in GitHub Desktop.
Exemplo de uso de um SAX parser para manipulação de arquivo XML
Deputado Matricula Ano Mes Tipo CNPJ Fornecedor Valor
Deputado A 021345 2017 5 Alimentacao 003.222.111/0001-23 Bar do Joao 122.30
Deputado A 021345 2017 5 Alimentacao 003.222.111/0001-23 Bar do Joao 122.30
Deputado B 021345 2017 5 Alimentacao 003.222.111/0001-23 Bar do Joao 122.30
Deputado D 021345 2017 5 Alimentacao 003.222.111/0001-23 Bar do Joao 122.30
Deputado B 021345 2017 5 Alimentacao 003.222.111/0001-23 Bar do Joao 122.30
<?xml version="1.0"?>
<root>
<despesa>
<Deputado>Deputado A</Deputado>
<Matricula>021345</Matricula>
<Ano>2017</Ano>
<Mes>5</Mes>
<Tipo>Alimentacao</Tipo>
<CNPJ>003.222.111/0001-23</CNPJ>
<Fornecedor>Bar do Joao</Fornecedor>
<Valor>122.30</Valor>
</despesa>
<despesa>
<Deputado>Deputado A</Deputado>
<Matricula>021345</Matricula>
<Ano>2017</Ano>
<Mes>5</Mes>
<Tipo>Alimentacao</Tipo>
<CNPJ>003.222.111/0001-23</CNPJ>
<Fornecedor>Bar do Joao</Fornecedor>
<Valor>122.30</Valor>
</despesa>
<despesa>
<Deputado>Deputado B</Deputado>
<Matricula>021345</Matricula>
<Ano>2017</Ano>
<Mes>5</Mes>
<Tipo>Alimentacao</Tipo>
<CNPJ>003.222.111/0001-23</CNPJ>
<Fornecedor>Bar do Joao</Fornecedor>
<Valor>122.30</Valor>
</despesa>
<despesa>
<Deputado>Deputado D</Deputado>
<Matricula>021345</Matricula>
<Ano>2017</Ano>
<Mes>5</Mes>
<Tipo>Alimentacao</Tipo>
<CNPJ>003.222.111/0001-23</CNPJ>
<Fornecedor>Bar do Joao</Fornecedor>
<Valor>122.30</Valor>
</despesa>
<despesa>
<Deputado>Deputado B</Deputado>
<Matricula>021345</Matricula>
<Ano>2017</Ano>
<Mes>5</Mes>
<Tipo>Alimentacao</Tipo>
<CNPJ>003.222.111/0001-23</CNPJ>
<Fornecedor>Bar do Joao</Fornecedor>
<Valor>122.30</Valor>
</despesa>
</root>
# -*- coding: utf-8 -*-
"""module
"""
from __future__ import print_function
from xml.sax import ContentHandler, parse
import csv
class Handler(ContentHandler):
"""SAX Handler para o documento XML
"""
def __init__(self):
ContentHandler.__init__(self)
self.despesa = {}
self.despesas = []
self.current_field = None
self.in_despesa = False
self.indent = 0
def startElement(self, name, attrs):
print('{}Start element: {}'.format('\t' * self.indent, name))
self.indent += 1
if self.in_despesa:
self.current_field = name
self.despesa[name] = ''
if name == 'despesa':
self.in_despesa = True
def endElement(self, name):
self.indent -= 1
print('{}End element: {}'.format('\t' * self.indent, name))
if name == 'despesa':
self.despesas.append(self.despesa)
self.despesa = {}
self.in_despesa = False
self.current_field = None
def characters(self, content):
if content.strip():
print('{}chars: {}'.format('\t' * self.indent, repr(content)))
if self.in_despesa and self.current_field:
self.despesa[self.current_field] += content
def gravar_despesas(writer, despesas):
"""Grava as despesas em um arquivo CSV
"""
cabecalhos = [
'Deputado',
'Matricula',
'Ano',
'Mes',
'Tipo',
'CNPJ',
'Fornecedor',
'Valor'
]
writer.writerow(cabecalhos)
for despesa in despesas:
writer.writerow([despesa.get(c, '').strip() for c in cabecalhos])
def main():
"""Funcão principal
É executada quando o script é invocado
"""
handler = Handler()
with open('despesas_gabinetes.xml', 'r') as xml_file:
parse(xml_file, handler)
print('Found {} despesas'.format(len(handler.despesas)))
with open('despesas.csv', 'w') as f_handle:
writer = csv.writer(f_handle)
gravar_despesas(writer, handler.despesas)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment