Pular para o conteúdo

Leitura de todos os valores de qualquer xml

Prezados, esta semana tive a necessidade de ler todos os valores de alguns arquivos xml para calculo de hash dos mesmos, inicialmente tentei usar expressões regulares para excluir as tags e ler os valores, como por exemplo : txtPuro=re.sub(r'(<[^>]*>)*([ \n\t])?','',string), só que o trabalho para adaptação do texto no modelo que eu precisava não justificou varias expressões regulares dentro de um texto que pode ser gigante no meu caso.

Então resolvi fazer um script em python para ler todos os valores  de qualquer arquivo xml com a utilização de recursão, para isto o algoritmo vai chamando a função readChild até que ele chegue na folha, ou seja, o nodo não possua filhos.

Bom segue abaixo o script que pode ser adaptado ou alterado por qualquer pessoa para seus fins particulares, desde que se mantenha a nota de autoria escrita no inicio do arquivo (muitos espertos vão apagar e falar que eles fizeram), mais ai já demonstra a capacidade da pessoa em ao menos respeitar o trabalho dos outros.

O script foi modelado para geração do hash do texto obtido, mais pode ser adaptado para qualquer outra utilidade. Qualquer dúvida podem entrar em contato.
César tinum da silva mago_dos_chats
Hits: 19.036 Categoria: Python Subcategoria: Avançado
  • Download
  • Nova versão
  • Indicar
  • Denunciar

Descrição

Prezados, esta semana tive a necessidade de ler todos os valores de alguns arquivos xml para calculo de hash dos mesmos, inicialmente tentei usar expressões regulares para excluir as tags e ler os valores, como por exemplo : txtPuro=re.sub(r'(<[^>]*>)*([ \n\t])?','',string), só que o trabalho para adaptação do texto no modelo que eu precisava não justificou varias expressões regulares dentro de um texto que pode ser gigante no meu caso.

Então resolvi fazer um script em python para ler todos os valores  de qualquer arquivo xml com a utilização de recursão, para isto o algoritmo vai chamando a função readChild até que ele chegue na folha, ou seja, o nodo não possua filhos.

Bom segue abaixo o script que pode ser adaptado ou alterado por qualquer pessoa para seus fins particulares, desde que se mantenha a nota de autoria escrita no inicio do arquivo (muitos espertos vão apagar e falar que eles fizeram), mais ai já demonstra a capacidade da pessoa em ao menos respeitar o trabalho dos outros.

O script foi modelado para geração do hash do texto obtido, mais pode ser adaptado para qualquer outra utilidade. Qualquer dúvida podem entrar em contato.
Download readTree.py Enviar nova versão

Esconder código-fonte

# -*- coding: iso-8859-1 -*-
"""Autor: César T. Silva <cesarts25@gmail.com> <magodoschatsbh@gmail.com>
   Data: 05/04/2012
   Copyrigth: Este software pode ser usado, alterado e distribuido de mandeira livre, desde que se mantenha a nota de autoria.
   Descrição: Leia todos os valores (nodeValue) de todos os nodos do xml atraves de recurssao em nodos populados (+1 filho)
"""
import hashlib , sys, md5,time
import xml.dom.minidom
class ReadXml():
    """INSTANCIA XML PARA INICIO DA LEITURA"""
    def __init__(self,arquivo):
        try:
            print "INICIANDO LEITURA DOS VALORES DO XML..."""
            self.arvore=input("DESEJA IMPRIMIR A ESTRUTURA DO ARQUIVO XML? 1(SIM)-0(NAO): ")
            if self.arvore != 1 and self.arvore !=0:
                self.arvore=0
            log=input("DESEJA CRIAR ARQUIVO COM VALORES DO XML? 1(SIM)-0(NAO): ")
            if log !=1 and log!=0:
                log=0
            timea=time.clock()
            self.limite=0
            self.arquivo=arquivo
            self.concat=""
            self.hash=""
            if self.arquivo==1:
                print 5*"*"+"ESTRUTURA XML ABAIXO"+5*"*"
            self.xmls = xml.dom.minidom.parse(arquivo+".xml")
            base = self.xmls.childNodes[0].childNodes
            self.readChild(base)
            self.setHash()
            print 60*'-'
            print "Nome Arquivo: " + arquivo + ".xml"
            print "Hash: " + self.hash
            timeb=time.clock()
            print "Tempo de Processamento: %f segundo(s)" % (timeb-timea)
            print 60*'-'
            if log:
                self.createLog()
            
        except:
            print sys.exc_info()
    def readChild(self,base):
        try:
            for node in base:
                if node.localName:
                    if self.arvore:
                        print self.limite*"-"+"> "+node.localName
                    if node.localName == "epilogo":
                        continue
                    if len(node.childNodes)>1:
                                    self.limite+=2
                                    self.readChild(nodo for nodo in node.childNodes)
                                    self.limite-=2
                    else:
                                    self.concat+= (node.childNodes[0].nodeValue).strip()
        except:
            print sys.exc_info()
    
    def setHash(self):
        cod=hashlib.md5()
        cod.update(self.concat.encode('iso-8859-1'))
        self.hash = cod.hexdigest()
        return

    def createLog(self):
        try:
            arq=file(self.arquivo+"_Texto.txt","w")
            arq.write(self.concat.encode('iso-8859-1'))
            arq.close()
        except:
            print "Erro ao salvar arquivo log: " +  sys.exc_info()

concat = ReadXml("NOME-DO-ARQUIVO-SEM-EXTENSAO")

Cronômetro com interface gráfico utilizando a biblioteca Tkinter

Script para comunicação OBD2

Utilizando a biblioteca Numpy

Um Script basico que tenho

Programa para calcular a média e a nota trimestral

#1 Comentário enviado por mago_dos_chats em 05/07/2012 - 21:28h
Iai galera comentários para melhoria?

Contribuir com comentário

Entre na sua conta para comentar.