Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

hdnrf

Renomear XML com alguns dados dele mesmo

Recommended Posts

Ola pessoal, estou precisando de uma ajuda/luz para resolver meu problema.

 

Estava tentando fazer em .bat mas não deu certo..

 

Preciso criar um programa para abrir um arquivo .xml e coletar algumas linhas

 

Ex do arquivo:

<?xml version="1.0" encoding="utf-8"?>
<nfeProc versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe">
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe Id="NFe3516031960........" versao="3.10">
<ide>
<cUF>35</cUF>
<cNF>0123456789</cNF>
<natOp>VENDA DE MERCADORIA</natOp>
<indPag>1</indPag>
<mod>55</mod>
<serie>1</serie>
<nNF>12121212</nNF>
<dhEmi>2016-03-29T00:00:00-03:00</dhEmi>
<dhSaiEnt>2016-03-29T23:05:00-03:00</dhSaiEnt>
<tpNF>1</tpNF>
<idDest>1</idDest>
<cMunFG>3543402</cMunFG>
<tpImp>1</tpImp>
<tpEmis>1</tpEmis>
<cDV>0</cDV>
<tpAmb>1</tpAmb>
<finNFe>1</finNFe>
<indFinal>0</indFinal>
<indPres>9</indPres>
<procEmi>0</procEmi>
<verProc>3.0.0</verProc>
</ide>
<emit>
<CNPJ>4545456000108</CNPJ>
<xNome>DISPAN COMERCIAL LTDA</xNome>
<xFant>DISPAN</xFant>
[...]

Preciso que ele abra o arquivo e pegue o conteudo das linhas "cNF", "dhEmi" e "xNome" e renomeio o arquivo com esses dados, ex:

 

cNF_dhEmi_xNome.xml ou seja: 0123456789_2016-03-29_DISPAN COMERCIAL LTDA.xml

 

Alguém pode me dar um norte?

 

Estou usando o programa "Dev-C++" para fazer isso.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu não me engano já existe bibliotecas para o que você deseja, caso contrario, você pode criar uma função simples que lê o arquivo XML até encontrar a área que você deseja, exemplo de codigo miojo(feito em 5 minutos):

#include <stdio.h>
#include <string.h>
//Corrigido
const char *obterDadosXML(const char *nomeDoArquivo, const char *codigoNoArquivo){
    //Abrindo arquivo!
    FILE *fp = fopen(nomeDoArquivo,"r");

    //Se não foi aberto
    if(fp == NULL){
        printf("Falha ao abrir o arquivo!\n");
        return NULL;
    }

    //Variáveis
    bool sair = false;
    char codigo[strlen(codigoNoArquivo) - 1];
    char buffer[512];
    char resultado[128];
    int len, lenc, ch = 0;

    //Inicializar variáveis
    codigo[0] = '\0';
    buffer[0] = '\0';
    resultado[0] = '\0';

    strcpy(codigo,codigoNoArquivo);
    codigo[strlen(codigo)] = '\0';
    len = strlen(codigo);

    //Lendo as linhas do arquivo - máximo 512 caracteres em cada linha
    while(!sair && fgets(buffer,512,fp)){
        //Verificando se o codigo pedido é o mesmo da linha no arquivo
        //** O codigo precisa estar na frente da linha
        for(int c = 0; c < len; c++)
            if(codigo[c] == buffer[c])
                lenc++;

        //Código encontrado
        //Ja que a quantidade de caracteres iguais é o que
        //determina se encontramos ou nao.
        if(lenc == len){
            //Copiando os dados da variavel
            for(int d = len; d < strlen(buffer); d++){
                //Como é xml geralmente termina com </
                if(buffer[d] == '<' && buffer[d+1] == '/'){
                    resultado[ch] = '\0';
                    sair = true;
                    break;
                }
                resultado[ch] = buffer[d];
                ch++;
            }
        }
        //Codigo nao encontrado
        else lenc = 0;

    }
    //Fecha arquivo
    fclose(fp);
    //Retornar resultado
    return resultado;
}


int main(){
    //Variáveis temporárias
    char arquivo[128],
    codigoNoArquivo[128],
    valorDoCodigo[128];

    //Inicializando elas
    arquivo[0]='\0';
    codigoNoArquivo[0]='\0';
    valorDoCodigo[0]='\0';


    //Questionario
    printf("Nome do arquivo:");
    gets(arquivo);
    printf("\nCodigo a ser encontrado no arquivo:");
    gets(codigoNoArquivo);


    //Obtendo dados no arquivo
    strcpy(valorDoCodigo,obterDadosXML(arquivo,codigoNoArquivo));


    //Se nao houver nada no resultado
    if(strlen(valorDoCodigo) <= 0)
        printf("\nDados nao encontrados!\n");
    else
        printf("\nResultado: %s!\n",valorDoCodigo);
    return 0;
}

Para renomear, creio que você precisa criar uma variavel do tipo string para armazenar o novo nome do arquivo, exemplo:

sprintf(novoNomeArquivo,"%s_%s_%s.xml",obterDadosXML(arquivo,"<cNF>"),
                                                     obterDadosXML(arquivo,"<dhEmi>"),
                                                     obterDadosXML(arquivo,"<xNome>"));

e depois você cria uma string para armazenar o comando a ser usado na função system, exemplo:

sprintf(comando,"ren %s %s",antingoNomeArquivo, novoNomeArquivo);
system(comando);

P.S: Na funcao obterDadosXML, você sempre vai ter que abrir o arquivo quando você for usar ela, mas se quiser pode abrir o arquivo na função main() e depois so envia as linhas para o obterDadosXML pegar os dados na linha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.