Created
January 7, 2018 16:59
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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