I can’t get all the XML file data and save it to a txt

Asked

Viewed 412 times

1

This is the 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 Training. As there is more than one tag with the same name (formation), when I put to save in a txt, only shows up the data of the first tag training and in my project one can add as many formations as you want.

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();
}

1 answer

0


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

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

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

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

    // faz o que precisa ser feito
}

This is a full 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 have seen, we have gone through both the list of people and the list of person formations. The generated TXT file, 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>

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 hint, if possible, avoid using special characters in tags and attributes of your XML, this may cause problems in the future.

  • Thank you so much!! It worked perfectly :D

Browser other questions tagged

You are not signed in. Login or sign up in order to post.