I can not get all the data from the XML file and save it to a txt

1

This is XML:

<cv>
    <pessoa id="1">
        <dadosPessoais>
            <nome></nome>
            <sexo></sexo>
            <idade></idade>
        </dadosPessoais>
        <formação>
            <instituição nome="" país="">
                <curso anoIni="" anoFim="" nível="">
                </curso>
            </instituição>
        </formação>
        <formação>
            <instituição nome="" país="">
                <curso anoIni="" anoFim="" nível="">
                </curso>
            </instituição>
        </formação>
    </pessoa>
</cv>

My difficulty is in reading the elements that are in tag Formation. Since there is more than one tag with the same name (formation), when I put it to save in a txt , it only shows up the data from the first tag my project the person can add as many formations as he wants.

try {
    doc = builder.build(f);
    root = (Element) doc.getRootElement();

    List<Element> pessoas = root.getChildren();

    for (int i = 0; i < pessoas.size(); i++){                                     
        Element pessoaS = pessoas.get(i);

        try { // criar
            File diretorio = new File("c:\CV");
            diretorio.mkdir(); //cria, se possível

            File arquivo = new File(diretorio, "cv_"+ pessoaS.getAttributeValue("id") +".txt");
            FileWriter fw;
            fw = new FileWriter(arquivo);
            BufferedWriter b = new BufferedWriter(fw);
            b.write("Nome: " + pessoaS.getChild("dadosPessoais").getChildText("nome"));
            b.write("\r\n");
            b.write("Sexo: " + pessoaS.getChild("dadosPessoais").getChildText("sexo"));
            b.write("\r\n");
            b.write("Idade: " + pessoaS.getChild("dadosPessoais").getChildText("idade"));
            b.write("\r\n\r\n");
            b.write(pessoaS.getChild("formação").getChild("instituição").getChild("curso").getAttributeValue("nível") + ": " + pessoaS.getChild("formação").getChild("instituição").getAttributeValue("nomeDaInstituicao")+ " (" + pessoaS.getChild("formação").getChild("instituição").getAttributeValue("nomePaisCurso") + ")");
            b.write("\r\n");
            b.write("Curso: " + pessoaS.getChild("formação").getChild("instituição").getChildText("curso"));
            b.write("\r\n");
            b.write("Início: " + pessoaS.getChild("formação").getChild("instituição").getChild("curso").getAttributeValue("anoIni"));
            b.write("\r\n");
            b.write("Término: " + pessoaS.getChild("formação").getChild("instituição").getChild("curso").getAttributeValue("anoFim"));

            b.write("\r\n\r\n");

            b.close();
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
} catch (JDOMException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
    
asked by anonymous 29.08.2015 / 07:18

1 answer

0

You need to retrieve a list of Element from the pessoa element, then go through this list. The way you do, retrieving a single Element formação will only retrieve the first formação node found in the XML. The way to recover the list of formations is simple, similar to how you are recovering people:

final List<Element> formacoes = pessoa.getChildren("formação");

After this, just go through each formation, something like this:

for (int j = 0; j < formacoes.size(); j++) {
    final Element formacao = formacoes.get(j);

    // faz o que precisa ser feito
}

This is a complete example doing what you need, I believe, using JDom version 2.0.2 :

final SAXBuilder builder = new SAXBuilder();
final File xml = new File("F:/CV/CV.xml");

final Document doc = builder.build(xml);
final Element root = doc.getRootElement();

final List<Element> pessoas = root.getChildren();

for (int i = 0; i < pessoas.size(); i++) {
    final Element pessoa = pessoas.get(i);

    final File diretorio = new File("F:/CV");

    final File arquivo = new File(diretorio, "cv_" + pessoa.getAttributeValue("id") + ".txt");

    try (final FileWriter fw = new FileWriter(arquivo); final BufferedWriter b = new BufferedWriter(fw)) {

        final Element dadosPessoais = pessoa.getChild("dadosPessoais");

        b.write("Nome: " + dadosPessoais.getChildText("nome"));
        b.write("\r\n");
        b.write("Sexo: " + dadosPessoais.getChildText("sexo"));
        b.write("\r\n");
        b.write("Idade: " + dadosPessoais.getChildText("idade"));
        b.write("\r\n\r\n");

        final List<Element> formacoes = pessoa.getChildren("formação");
        for (int j = 0; j < formacoes.size(); j++) {
            final Element formacao = formacoes.get(j);
            final Element instituicao = formacao.getChild("instituição");
            final Element curso = instituicao.getChild("curso");
            b.write(curso.getAttributeValue("nível") + ": ");
            b.write(instituicao.getAttributeValue("nome"));
            b.write(" (" + instituicao.getAttributeValue("país") + ")");
            b.write("\r\n");

            b.write("Curso: " + curso.getText());
            b.write("\r\n");
            b.write("Início: " + curso.getAttributeValue("anoIni"));
            b.write("\r\n");
            b.write("Término: " + curso.getAttributeValue("anoFim"));
            b.write("\r\n\r\n");
        }
    }
}

As you've seen, we've gone through both the list of people and the list of formations of the person. The TXT file generated, using this XML:

<cv>
    <pessoa id="1">
        <dadosPessoais>
            <nome>Bruno César</nome>
            <sexo>M</sexo>
            <idade>26</idade>
        </dadosPessoais>
        <formação>
            <instituição nome="UFG" país="Brazil">
                <curso anoIni="2009" anoFim="2014" nível="Graduação">Engenharia de Software</curso>
            </instituição>
        </formação>
        <formação>
            <instituição nome="UFSC" país="Brazil">
                <curso anoIni="2015" anoFim="2017" nível="Mestrado">Pós-Graduação em Ciência da Computação</curso>
            </instituição>
        </formação>
    </pessoa>
</cv>

It has this content:

Nome: Bruno César
Sexo: M
Idade: 26

Graduação: UFG (Brazil)
Curso: Engenharia de Software
Início: 2009
Término: 2014

Mestrado: UFSC (Brazil)
Curso: Pós-Graduação em Ciência da Computação
Início: 2015
Término: 2017

As a tip, if possible, avoid using special characters in tag names and attributes of your XML, this may cause problems in the future.

    
29.08.2015 / 15:30