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 + '}';
}
}