Help with logic

4

I have a method that reads multiple tags from an .xml file and returns a list populated by the read data.

Problem: Each xml file has several batches and inside the batch has several tabs, for example, I have a client named Rodrigo and it is in a tab with an X procedure, the system can read this client, when it moves to the other I have the Client Rodrigo again, but now in this guide it has several procedures: y, z, w ... When my list is returned and I generate the report it always repeats the Client name, like this:

Nome: Rodrigo
Procedimento X

Nome Rodrigo
Procedimento Y

Nome Rodrigo
Procedimento Z

Nome Rodrigo
Procedimento W

I wanted to display them in such a way:

Nome Rodrigo
Procedimento X //Esse é p procedimento da primeira guia, como só tem um ele é separado

Nome Rodrigo //Na segunda guia o cliente Rodrigo possui 3 procedimentos, então todos são listados juntos
Procedimento Y
Procedimento Z
Procedimento W

Method:

public List<Procedimentos> realizaLeituraXML(String arquivoXML) throws ParserConfigurationException, SAXException, IOException {
        //fazer o parse do arquivo e criar o documento XML
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(arquivoXML);

        Element elem = doc.getDocumentElement();
        NodeList tagdadosLote = elem.getElementsByTagName("unimed:dadosLote");

        List<Procedimentos> listaLote = new ArrayList<>();
        System.out.printf("\n tagdadosLote %s ", tagdadosLote.getLength());
        for (int i = 0; i < tagdadosLote.getLength(); i++) {
            NumeroLote n = new NumeroLote();
            String lote = "";

            Element elementoLote = (Element) tagdadosLote.item(i);
            lote = pegaTag(elementoLote, "unimed:numeroLote");

            NodeList tagGuia = (NodeList) elementoLote.getElementsByTagName("unimed:guia");
            // Como sabemos pela estrutura que só tem 1 elemento não necessitamos de um for podendo fixar o indice.
            NodeList tagdadosGuia = ((Element) tagGuia.item(0)).getElementsByTagName("unimed:dadosGuia");

            for (int y = 0; y < tagdadosGuia.getLength(); y++) {
                //Procedimentos proc = new Procedimentos();
                Procedimentos contato = new Procedimentos();
                NodeList tagBeneficiario0 = ((Element) tagdadosGuia.item(y)).getElementsByTagName("unimed:beneficiario");
                NodeList tagProcedimentos = ((Element) tagdadosGuia.item(y)).getElementsByTagName("unimed:procedimentos");
                NodeList tagProcedimentos1 = ((Element) tagProcedimentos.item(0)).getElementsByTagName("unimed:dadosProcedimento");

                Element elementoBeneficiarioname = (Element) tagdadosGuia.item(y);
                String nomeBeneficiario = (pegaTag(elementoBeneficiarioname, "unimed:nomeBeneficiario"));
                contato.setNomeBeneficiario(nomeBeneficiario);

                for (int a = 0; a < tagProcedimentos1.getLength(); a++) {
                    NodeList tagProcedimento = ((Element) tagProcedimentos1.item(a)).getElementsByTagName("unimed:procedimento");

                    for (int b = 0; b < tagProcedimento.getLength(); b++) {
                        //Aqui é onde pego os demais dados Do arquivo XML e passo para meu objeto "contato"
                        //Deixei vazio pois é um metodo muito extenso

                        listaLote.add(contato);
                    }

                }

            }

        }

        //System.err.println("Lista lote: " + listaLote);
        return listaLote;

    }

How can I do to list this data the way I want it? When I put listaLote.add(contato); into For that runs tagDadosGuia It lists the clients name right, but only takes the first procedure like this:

Nome Rodrigo
Procedimento X

Nome Rodrigo
Procedimento Y //Para nesse procedimento e não pega os restantes Z e W

It only takes all procedures if the listaLote.add(contato); is within the last For but when this happens it always repeats the names as shown above, thanks.

Updated 25/05

My class Procedures:

public class Procedimentos {

    private String numLote;
    private String dataRealizacao;
    private String descriçãoServico;
    private String codTab;
    private String codigoServico;
    private String quantidadeExecutada;
    private BigDecimal valorProcessado;
    private BigDecimal valorLiberado;
    private BigDecimal valorGlosa;
    private String codigoGlosa;
    private String sequenciaGuiaProcedimento;
    private String sequenciaGuiaDados;
    private String nomeBeneficiario;
    private String valorLiberadoGuia;
    private String numeroGuiaSenha;

    private List<DetalhesProcedimentos> listaProcedimentos;
    ...

In the method that read the xml I declare:

 List<DetalhesProcedimentos> list = new ArrayList<>();

and within for that runs through tagProcedimento I did this:

DetalhesProcedimentos p1 = new DetalhesProcedimentos();
Element elementoBeneficiarioDescricaoServico = (Element) tagProcedimento.item(b);
                        beneficiariosLote.add(pegaTag(elementoBeneficiarioDescricaoServico, "unimed:descricao"));
                        p1.setDescricaoServico(pegaTag(elementoBeneficiarioDescricaoServico, "unimed:descricao"));

list.add(p1);
p.setListaProcedimentos(list);

And this is the class DetailsProcedures:

public class DetalhesProcedimentos {

    private String dataRealizacao;
    private String descricaoServico;

    public String getDataRealizacao() {
        return dataRealizacao;
    }

    public void setDataRealizacao(String dataRealizacao) {
        this.dataRealizacao = dataRealizacao;
    }

    public String getDescricaoServico() {
        return descricaoServico;
    }

    public void setDescricaoServico(String descricaoServico) {
        this.descricaoServico = descricaoServico;
    }

    @Override
    public String toString() {
        return "DetalhesProcedimentos{" + "dataRealizacao=" + dataRealizacao + ", descricaoServico=" + descricaoServico + '}';
    }

}
    
asked by anonymous 22.05.2015 / 15:10

1 answer

4

By what I understand your class Procedures () will contain a contato (let's assume it's just the name) and a list of n procedimentos

Then the pseudo code should be something like this (I've omitted parts of parse from XML:

for (int y = 0; y < tagdadosGuia.getLength(); y++) {
    Procedimentos contato = new Procedimentos();
    NodeList tagBeneficiario0 = ((Element) tagdadosGuia.item(y)).getElementsByTagName("unimed:beneficiario");
    NodeList tagProcedimentos = ((Element) tagdadosGuia.item(y)).getElementsByTagName("unimed:procedimentos");
    NodeList tagProcedimentos1 = ((Element) tagProcedimentos.item(0)).getElementsByTagName("unimed:dadosProcedimento");

    Element elementoBeneficiarioname = (Element) tagdadosGuia.item(y);
    String nomeBeneficiario = (pegaTag(elementoBeneficiarioname, "unimed:nomeBeneficiario"));
    contato.setNomeBeneficiario(nomeBeneficiario);

    for (int a = 0; a < tagProcedimentos1.getLength(); a++) {
        NodeList tagProcedimento = ((Element) tagProcedimentos1.item(a)).getElementsByTagName("unimed:procedimento");

        for (int b = 0; b < tagProcedimento.getLength(); b++) {
            // Aqui você terá n procedimentos então       
            contato.addProcedimeto(magicaPraPegarProcedimento())     
            // O método magicaPraPegarProcedimento assume que vocêpega um procedimento do XML. E então armazena num array na classe Procedimentos()                         
        }

        listaLote.add(contato); // Add o contato a lista 
    }

}

Editing based on your update and our discussion in the comments.

You understand my suggestion a little wrong. Instead of private List<Procedimentos> listaProcedimentos;

You will have a Procedure list, which will be a new Class, it can be a simple class that has only one string. You may even have only one string list.

Looking like this:

private List<String> listaProcedimentos;

What really matters is that you have a list in Procedimentos , where each element in that list describes a single procedure. Is it clearer now?

So you can add in the% innermost% of this list and at the end Procedures () will contain a list, and then you will have the desired result.

    
22.05.2015 / 21:23