hdnrf 0 Denunciar post Postado Abril 20, 2016 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
freak1Day 1 Denunciar post Postado Maio 9, 2016 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