6
respostas

Duvida

Boa Tarde , tenho um arquivo xml grande , quando vou aplicar SAX para ler ele , consigo pegar todos os dados , quando peço para mostrar com

System.out.println(logica.getCounters());

Ele funciona correto, mas ainda assim só mostra a ultima linha dos valores (no caso é um xml com varias tags).

dentro do endElement consigo printa todos os valores no console, porque quando faço o set para a model ele me retorna somente a última linha ?

Segue o código Leitor XML

package projectoSFTP;


import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.opencsv.CSVWriter;

public class LeitorXML extends DefaultHandler {

    private StringBuilder conteudo;
    private List<NokiaCounters> lista = new ArrayList<NokiaCounters>();
    private NokiaCounters nokia;
    private String a = "";



    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {


        if(qName.equals("PMSetup")) {
            nokia = new NokiaCounters();


        }
        conteudo = new StringBuilder();

    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {

        conteudo.append(new String(ch, start, length));

    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if(qName.equals("PMSetup")) {

            lista.add(nokia);

        }else if(qName.equals("M8006C1")) {


                nokia.setEPS_BEARER_SETUP_COMPLETIONS(conteudo.toString());

        }

    }


    public List<NokiaCounters> getCounters() {
        return lista;
    }





}

Main :

package projectoSFTP;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

import com.opencsv.CSVWriter;

public class TESTEFINAL {

    public static void main(String[] args) throws Exception {

        File pasta = new File("C:\\Users\\jessi\\Desktop\\HOJE\\lte\\");
        File[] arquivos = pasta.listFiles();

        for (int i = 0; i < arquivos.length; i++) {

            System.out.println(arquivos[i]);

            XMLReader leitor = XMLReaderFactory.createXMLReader();
            LeitorXML logica = new LeitorXML();
            leitor.setContentHandler(logica);
            InputStream ips = new FileInputStream(arquivos[i]);
            InputSource is = new InputSource(ips);
            leitor.parse(is);

            System.out.println(logica.getCounters().get(0));



        }



    }

}

Consigo fazer tudo , mas não mostra todos os valores!! Podem me ajudar ?

6 respostas

Boa tarde, Jessica! Como vai?

Isso ocorre pois o SAX vai ler o seu XML linha a linha! Sem colocar todo o conteúdo na memória.

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, minha aluna!

Gabriel então para eu ter todos os valores guardados na memória somente com DOM ? Porque com DOM o processo fica lento demais !! Tem alguma opção ?

Gabriel então para eu ter todos os valores guardados na memória somente com DOM ? Porque com DOM o processo fica lento demais !!

Sim, fica lento devido ao tamanho do XML. É justamente essa motivação que o instrutor usa durante o curso pra introduzir o SAX.

Tem alguma opção ?

Sim, através dos métodos de evento do SAX vc terá que ir montando o seu modelo aos poucos e colocando no modelo os valores correspondentes que vc desejar.

teria alguma aula referente a isso Gabriel ? ou algum exemplo ?

Dá uma olhada nessa aula. Qualquer coisa, se o problema ainda persistir é só avisar aqui que eu apareço pra te ajudar a chega na luz do conhecimento!

Gabriel , consegui que repetisse somente a ultima linha !! Se puder me dar uma luz : Segue um exemplo de xml :

 <PMSetup  startTime="2019-12-03T00:30:00.000-03:00:00" interval="15">
    <PMMOResult>
      <MO>
        <DN><![CDATA[PLMN-PLMN/MRBTS-910264]]></DN>
      </MO>
      <PMTarget  measurementType="SBTS_Energy_Consumption">
        <M40002C0>7675</M40002C0>
        <M40002C1>19433</M40002C1>
        <M40002C2>27108</M40002C2>
      </PMTarget>
    </PMMOResult>
    <PMMOResult>
      <MO>
        <DN><![CDATA[PLMN-PLMN/MRBTS-910264/LNBTS-910264]]></DN>
      </MO>
      <PMTarget  measurementType="LTE_S1AP">
        <M8000C6>0</M8000C6>
        <M8000C7>0</M8000C7>

      </PMTarget>
    </PMMOResult>

    </PMMOResult>
</PMSetup> 
 <PMSetup  startTime="2019-12-03T00:45:00.000-03:00:00" interval="15">
    <PMMOResult>
      <MO>
        <DN><![CDATA[PLMN-PLMN/MRBTS-910264]]></DN>
      </MO>
      <PMTarget  measurementType="SBTS_Energy_Consumption">
        <M40002C0>7675</M40002C0>
        <M40002C1>12571</M40002C1>
        <M40002C2>20246</M40002C2>
      </PMTarget>
    </PMMOResult>
    <PMMOResult>
      <MO>
        <DN><![CDATA[PLMN-PLMN/MRBTS-910264/LNBTS-910264]]></DN>
      </MO>
      <PMTarget  measurementType="LTE_S1AP">
        <M8000C6>0</M8000C6>
        <M8000C7>0</M8000C7>

      </PMTarget>
    </PMMOResult>
  </PMSetup>

É separado pela tag que corresponde ao tempo, e preciso pegar todas as tags e guardar em uma variável !!

Meu leitor XML

package projectoSFTP;


import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.opencsv.CSVWriter;

public class LeitorXML extends DefaultHandler {

    private StringBuilder conteudo;
    private List<NokiaCounters> lista = new ArrayList<NokiaCounters>();
    private NokiaCounters nokia;


    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        //System.out.println("abriu a tag: " + qName);
        if(qName.equals("PMSetup")) {
                nokia = new NokiaCounters();


            }
        conteudo = new StringBuilder();

    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {

        conteudo.append(new String(ch, start, length));

    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if(qName.equals("PMSetup")) {

            lista.add(nokia);

        }else if(qName.equals("M8006C1")) {
            nokia.setEPS_BEARER_SETUP_COMPLETIONS(conteudo.toString());
        }else if(qName.equals("M8013C18")) {
            nokia.setSIGN_CONN_ESTAB_ATT_MT(conteudo.toString());
        }

    }


    public List<NokiaCounters> getCounters() {
        return lista;
    }





}

minha MAIN :

package projectoSFTP;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

import com.opencsv.CSVWriter;

public class TESTEFINAL {

    public static void main(String[] args) throws Exception {

        File pasta = new File("C:\\Users\\jessi\\Desktop\\HOJE\\lte\\");
        File[] arquivos = pasta.listFiles();

        for (int i = 0; i < arquivos.length; i++) {

            System.out.println(arquivos[i]);

            XMLReader leitor = XMLReaderFactory.createXMLReader();
            LeitorXML logica = new LeitorXML();
            leitor.setContentHandler(logica);
            InputStream ips = new FileInputStream(arquivos[i]);
            InputSource is = new InputSource(ips);
            leitor.parse(is);

            System.out.println(logica.getCounters());



        }



    }

}

Realmente me mostra os ultimos elementos só !! esse é o meu console

[deu certo : 26 8, deu certo : 28 8]

ele me mostra os dois valores nos 2 setups que possuo ... só preciso que me mostre os valores anteriores Se conseguir me ajudar eu agradeço