Filter files by their extension(xml, rar, docx....)

Asked

Viewed 89 times

1

Good Afternoon, I have an algorithm that takes all the files of an x directory, and reads them, but these files have to be XML, and sometimes RAR files appear, then at the time of reading give error because it cannot enter the file, would have something I can do for it to read is only XML, discarding the other files?

Here it reads the localXML.xml, where it is informed where it is saved and soon after it is creates an array with the name of all the files, whether XML or not.

// realiza a leitura do xml para identificar o local onde esta os XMLs salvos
    File lerxml = new File("C:\\FTP\\arquivos\\localXML.xml");
    xml = builder.parse(lerxml);
    NodeList locais = xml.getElementsByTagName("localXML");
    e = (Element) locais.item(0);
    String local = e.getTextContent();

    // ja com a identificação feita é criado um vetor onde é recebido o nome de tds os xmls
    File diretorio = new File(local);
    arquivos = diretorio.listFiles();
    int i; // contador primeiro for
    int j; // contador segundo for
    int a = 0; // contador de linhas geradas

what I would like is that it only takes the XML disregarding the other files, or, in hr trying to read the same, it checks whether it is XML or not, if it is not it nor runs the reading.

Complete code

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ftp;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 *
 * @author samuel.silva
 */
public class FTP {

    public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException {
        DocumentBuilderFactory fabrica = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = fabrica.newDocumentBuilder();
        Document xml;
        Element e;
        File arquivos[];

        // realiza a leitura do xml para identificar o local onde esta os XMLs salvos
        File lerxml = new File("C:\\FTP\\arquivos\\localXML.xml");
        xml = builder.parse(lerxml);
        NodeList locais = xml.getElementsByTagName("localXML");
        e = (Element) locais.item(0);
        String local = e.getTextContent();

        // ja com a identificação feita é criado um vetor onde é recebido o nome de tds os xmls
        File diretorio = new File(local);
        arquivos = diretorio.listFiles();
        int i; // contador primeiro for
        int j; // contador segundo for
        int a = 0; // contador de linhas geradas

        //entra em um arquivo por vez pegando os dados
        for (i = 0; i < arquivos.length; i++) {
            // realiza a leitura para saber quantos dados tem no xml atual
            xml = builder.parse(arquivos[i]);
            xml.getDocumentElement().normalize();
            NodeList quant = xml.getElementsByTagName("esn");
            int k = quant.getLength();

            // le tds os dados do xml atual
            for (j = 0; j < k; j++) {
                a++; // contador

                //pegas a informação referente aos Playload
                NodeList payloads = xml.getElementsByTagName("payload");
                e = (Element) payloads.item(j);
                String payload = e.getTextContent();
                System.out.println(payload);

                //pegas a informação referente aos esn
                NodeList aparelhos = xml.getElementsByTagName("esn");
                e = (Element) aparelhos.item(j);
                String esn = e.getTextContent();
                System.out.println(esn);

                //pegas a informação referente aos timeStamp
                NodeList timeStamps = xml.getElementsByTagName("stuMessages");
                e = (Element) timeStamps.item(0); // diferente da capturas anterior, o timeStamp é unico dentro de cada arquivo
                String timeStamp = e.getAttribute("timeStamp");
                System.out.println(timeStamp);

                //realiza a criação de varios csn, onde cada csv é referente a um modem(esn)
                File arquivo = new File("C:\\Ler XML\\resultado.csv");
                arquivo.createNewFile(); //Caso voce queira criar um novo arquivo a partir de cada formulario use esse comando
                try (FileWriter fw = new FileWriter(arquivo, true)) {
                    //salva as informações no mesmo
                    fw.write(payload + ";" + esn + ";" + timeStamp + "\r\n");
                }
            }
        }
        // contador de linhas Geradas
        System.out.println("Numero de Linhas Geradas: " + a);
    }

}

----------------------------Update 2 ---------------------------------------

I did what you said But this presenting an error now, follow Print inserir a descrição da imagem aqui

1 answer

0


A simple solution is to checks the file extension inside your for:

//entra em um arquivo por vez pegando os dados
for (i = 0; i < arquivos.length; i++) {
    //verifica se é um arquivo xml
    if (arquivos[i].getName().toLowerCase().endsWith(".xml")) {

This way only the extension files xml will be parsed.


Another solution would be to check the file extension, but using the class FilenameFilter, we import the class for use:

import java.io.FilenameFilter;

And in the method listFiles, instancimos the same creating the method accept, thus filtering only extension files xml:

arquivos = diretorio.listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
        return name.toLowerCase().endsWith(".xml");
    }
});
  • I performed an Update 2 on my question

  • I did a search and found that the error may be XML that something is missing.

  • However I am talking about 3180 xml, there is no way I can locate which one is with the problem, in case I would have to ignore it in hr to run the algorithm, find a way to read. every day I’ll have this file base

  • Try to make an exception treatment during the parser, it will already stop giving error and you can still figure out which XML is incorrect.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.