JAVA - Problema ao ler arquivo XML com JDON

Estou tentando fazer a leitura do seguinte XML com JDON:

<?xml version="1.0" encoding="UTF-8"?>
<registros>
    <referencia ano="2017">
        <bimestre>
            <nome>1º Bimestre</nome>
            <texto>algum texto 1</texto>
            <arquivo>Financeiras\LDO\LDO1.pdf</arquivo>
        </bimestre>
            
        <bimestre>
            <nome>2° Bimestre</nome>  
            <texto>algum texto 2</texto>
            <arquivo>Financeiras\LDO\LDO2.pdf</arquivo>
        </bimestre>
    </referencia>
        
    <referencia ano="2016">
        <bimestre>
            <nome>1° Bimestre</nome>
            <texto>algum texto 3</texto>
            <arquivo>Financeiras\LDO\LDO3.pdf</arquivo>
        </bimestre>
            
        <bimestre>
            <nome>2° Bimestre</nome>  
            <texto>algum texto 4</texto>
            <arquivo>Financeiras\LDO\LDO4.pdf</arquivo>
        </bimestre>
    </referencia>
 </registros>   

O método que faz a leitura é esse:

   private void montaDadosDataTable() throws JDOMException, IOException  {
        File f = new File(this.getArquivoXML()); //aqui eu busco o caminho do meu arquivo xml

        SAXBuilder builder = new SAXBuilder();

        Document doc = builder.build(f);

         Element root = (Element) doc.getRootElement();

        List objetos = root.getChildren();

        Iterator i = objetos.iterator();

        while (i.hasNext()) {
            Element obj = (Element) i.next();
            System.out.println("Referencia: "+obj.getAttributeValue("ano"));
            System.out.println("Bimestre: "+obj.getChild("bimestre").getChildText("nome") );
            System.out.println("Descrição: "+obj.getChild("bimestre").getChildText("texto") );
            System.out.println("Arquivo: "+obj.getChild("bimestre").getChildText("arquivo"));
            
            
        }
        
    }

O problema desse método é que ele so me mostra os dados do primeiro bimestre de cada referência, o que estou fazendo errado? Desde já agradeço…

1 curtida

Eu chutaria que você precisa iterar sobre os elementos (childNodes) da referência. Mas, é um chute, não conheço jdom.

Teria como me mostrar como ficaria no código?

Ainda estou com esse problema, se alguem puder me ajudar…

Como eu te disse, nunca usei jdon (ou jdom).
Mas, olhando pela estrutura do teu xml, eu chutei o que disse antes.
Veja bem, dentro do teu root (a tag registros), você só tem a tag referencia.
Logo, não vejo sentido que funcione (afinal, você consegue acessar os dados do primeiro semestre) quando você coloca isso

    while (i.hasNext()) {
        Element obj = (Element) i.next();
        System.out.println("Referencia: "+obj.getAttributeValue("ano"));
        System.out.println("Bimestre: "+obj.getChild("bimestre").getChildText("nome") );
        System.out.println("Descrição: "+obj.getChild("bimestre").getChildText("texto") );
        System.out.println("Arquivo: "+obj.getChild("bimestre").getChildText("arquivo"));
    }

Na minha porca experiência com xml e java, eu faria mais um cast ao ler o elemento e, então, faria uma nova iteração. Ressalto que não sei se funcionará

List objetos = root.getChildren();

Iterator i = objetos.iterator();

while (i.hasNext()) {
    Element obj = (Element) i.next();
    List children = obj.getChildren();
    Iterator it = children.iterator();
    System.out.println("Referencia: "+obj.getAttributeValue("ano"));
    while(it.hasNext()) {
        Element obj1 = (Element) it.next();
        System.out.println("Bimestre: "+obj1.getChildText("nome") );
        System.out.println("Descrição: "+obj1.getChildText("texto") );
        System.out.println("Arquivo: "+obj1.getChildText("arquivo"));
    }
}
1 curtida

Olá Luis, desculpe a demora para dar o retorno…
Realmente esse era o problema, era preciso fazer uma nova iteração sobre o elemento para que ele lesse os próximos bimestres. Obrigado!