Criando XML com JDOM

Olá galera,

Eu achei um tutorial sobre essa biblioteca!! Muito boa e muito fácil de fazer um XML e ler também, porém tem 2 problemas.

1- Quando eu vou escrever outro XML, ele apaga o conteúdo do anterior e cria um novo, não tem como ir cadastrando no arquivo?

2- Como eu faço para atualizar o valor das tags que tem no XML? Por exemplo, tenho a tag Teste e quero atualizar para Teste 2… Tem como?

Vou postar aqui a classe que eu fiz para testar:

[code]/*

  • Main.java
  • Created on 8 de Outubro de 2007, 15:29
    */

package muralxml;

import java.io.;
import java.util.
;
import org.jdom.;
import org.jdom.input.
;
import org.jdom.output.*;

/**
*

  • @author anderson
    */
    public class Main {
    // Metodo para ler o arquivo XML
    public static void ler() throws JDOMException, IOException {
    File f = new File(“mural.xml”);

     SAXBuilder sb = new SAXBuilder();
     
     Document d = sb.build(f);
     
     Element mural = d.getRootElement();
     
     List elements = mural.getChildren();
     Iterator i = elements.iterator();
     
     while(i.hasNext()) {
         Element element = (Element)i.next();
         System.out.println("Código: " + element.getAttributeValue("id"));
         System.out.println("Prioridade: " + element.getAttributeValue("prioridade"));
         System.out.println("Para: " + element.getChildText("para"));
         System.out.println("De: " + element.getChildText("de"));
         System.out.println("Corpo: " + element.getChildText("corpo"));
     }
    

    }

    // Metodo para escrever o arquivo
    public static void escrever(String p, String d, String c) {
    Element mural = new Element(“mural”);
    Element mensagem = new Element(“mensagem”);
    Element para = new Element(“para”);
    Element de = new Element(“de”);
    Element corpo = new Element(“corpo”);

     mensagem.setAttribute("id", "1");
     
     Attribute prioridade = new Attribute("prioridade","-1");
     mensagem.setAttribute(prioridade);
     
     para.setText(p);
     de.setText(d);
     corpo.setText(c);
     
     mensagem.addContent(para);
     mensagem.addContent(de);
     mensagem.addContent(corpo);
     
     mural.addContent(mensagem);
     
     Document doc = new Document();
     doc.setRootElement(mural);
     
     try {
         Writer out = new BufferedWriter(new OutputStreamWriter(
             new FileOutputStream("mural.xml"), "UTF8"));
         
         XMLOutputter xout = new XMLOutputter();
         xout.output(doc,out);
         
         System.out.println("XML criado com sucesso!");
     } catch (UnsupportedEncodingException e) {
         e.printStackTrace();
     } catch (IOException e) {
         e.printStackTrace();
     }
    

    }

    /**

    • @param args the command line arguments
      */
      public static void main(String[] args) throws IOException, JDOMException {
      String opcao = “”;
      String para, de, corpo;

      System.out.println("–Seja bem-vindo ao MuralXML–");
      System.out.println(“Opções:”);
      System.out.println(“1 - Criar o XML”);
      System.out.println(“2 - Ler o XML”);
      System.out.println(“3 - Sair”);
      System.out.println("-----------------");

      do {
      System.out.print("\nDigite a opção: ");
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      opcao = in.readLine();

       if (opcao.equals("1")) {
           System.out.println("-----------------");
           System.out.print("Informe para: ");
           in = new BufferedReader(new InputStreamReader(System.in));
           para = in.readLine();
      
           System.out.print("Informe de: ");
           in = new BufferedReader(new InputStreamReader(System.in));
           de = in.readLine();
      
           System.out.print("Informe corpo: ");
           in = new BufferedReader(new InputStreamReader(System.in));
           corpo = in.readLine();
      
           escrever(para, de, corpo);
       } else if (opcao.equals("2")) {
           ler();
       } else if (opcao.equals("3")) {
           System.out.println("Saindo...");
       } else {
           System.out.println("Opção Inválida!!!!!");
       }
      

      } while(!opcao.equals(“3”));
      }

}
[/code]

Obrigado desde já pela ajuda.
Abraços.

[quote=Pilantra]Olá galera,

Eu achei um tutorial sobre essa biblioteca!! Muito boa e muito fácil de fazer um XML e ler também, porém tem 2 problemas.

1- Quando eu vou escrever outro XML, ele apaga o conteúdo do anterior e cria um novo, não tem como ir cadastrando no arquivo?

2- Como eu faço para atualizar o valor das tags que tem no XML? Por exemplo, tenho a tag Teste e quero atualizar para Teste 2… Tem como?
[/quote]

  1. XML não é banco de dados, é um arquivo texto. Em um arquivo-texto você só pode gravar (desde o começo ou então a partir do final da última gravação). Nesse caso não é adequado fazer a gravação a partir do final da última gravação, porque você teria automaticamente um XML inválido. Se você realmente quer fazer isso, você tem de ler o XML antigo, modificar os dados desejados, e gravar o XML novo no arquivo desejado.
  2. Você precisa localizar a tag dentro do seu DOM de alguma maneira.

Conselho: XML serve para duas coisas:

  • Configurações (um altera, muitos lêem)
  • Troca de dados entre aplicações.
    Não serve como banco de dados, a menos que você saiba o que está fazendo.

Hum, beleza, vou aperfeiçoar esses método para que funcione nesse modo. Na verdade eu quero pra fazer arquivo de configuração mesmo e/ou para uma agenda. Apesar que fazer via banco de dados seria mil vezes mais facil, pra distribuir depois é complicado.

Abraços.

Amigos estou exatamente com o mesmo problema do colega acima. Discordo completamente que xml tem como principais funções apenas - Configurações (um altera, muitos lêem) e Troca de dados entre aplicações.
Ele serve sim como uma ótima alternativa de armazenamento de dados sim. Sou programador também em php e consigo tranquilamente manipular arquivos XML incluindo novos registro a um arquivo. Vamos fazer uma força tarefa aqui para desenvolvermos um classe simples de manipulação de banco de dados com metódos bem definidos para abrir, escrever, pesquisar e fechar o arquivo.

Estou começando a desenvolver a classe, vou utiliza-la para um modulo de um sistema para ratreamento de transporte de encomendas. Simplesmente preciso guardar em um arquivo xml os dados referente ao local, um id, data e hora do cadastro e stado em que se encontra a encomenda. Segue Abaixo o código que comecei a desenvolver.

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.jdom.*;
import org.jdom.output.XMLOutputter;

public class Manipularquivo {

public String caminho = "/home/arquivos/TFG/projeto/PDA/arquivo.xml";
public File arq = new File(caminho);

/** Creates a new instance of Manipularquivo */
public Manipularquivo() {

//verifica a existência do arquivo, se não existir um novo arquivo é criado

    if (!arq.exists() ) {
        boolean rcria = cria_arquivo();
        }

}

public boolean cria_arquivo(){
    	try {
		//criando estrutura do arquivo xml
                    Element encomendas = new Element ("encomendas");
                    //Define encomendas como root
                    Document documento = new Document(encomendas);
                    //Classe responsável para imprimir / gerar o XML
                    XMLOutputter xout = new XMLOutputter();  
    
                     //Criando o arquivo de saida
		FileWriter arquivo = new FileWriter(
                            new File(caminho));
		//imprimindo o XML no arquivo
                    xout.output(documento, arquivo);                      

                    return true;
		
            } catch (IOException e) {
			return false;
                    }	
}

//SIMPLESMENTE DESEJAMOS AQUI INCLUIR NOVOS REGISTROS PERTECENTES AO ELEMENT ROOT

public boolean grava_dados(String id, String local, String status, String datahora){
    Element encomendas = new Element ("encomendas");
    //Define encomendas como root
    Document documento = new Document(encomendas);
    //ATRIBUINDO VALORES AS TAGS QUE COMPÕE A ENCOMENDA
    Element encomenda = new Element("encomenda");
    encomenda.setAttribute("id", id);
    Element localizacao = new Element("localocalizacao");
    localizacao.setText(local);
    Element estado = new Element("estado");
    estado.setText(status);
    Element momento = new Element("momento");
    momento.setText(datahora);
    //ADICIONAR OS ELEMENTES PERTENCENTES A ENCOMENDA
    encomenda.addContent(localizacao);
    encomenda.addContent(estado);
    encomenda.addContent(momento);
    //adicionando a encomenda em encomendaS
    //encomendas.addContent(encomenda);
    XMLOutputter xout = new XMLOutputter();
    boolean resultado = true; 
    try {
		FileWriter dados = new FileWriter(caminho);
                    //Imprimindo o XML no arquivo
		xout.output(documento, dados);

//ACIMA NA VERDADE NÃO PRECISAMOS CRIAR UM NOVO ARQUIVO DE SAIDA E SIM DESCOBRIR SIMPLESMENTE UM MODO DE INSERIR UM NOVO REGISTRO

                } catch (IOException e) {
			resultado=false;
		}	
    
    
    return resultado;
}

}

XML não é banco de dados. Se voce quer armazenar configurações ai sim, eu aconselho com de fato ele serve para isso na maioria das vezes.

Quem acha que xml serve apenas para guardar configurações realmente não tem noção da amplitude de aplicação desta tecnologia.
De qualquer forma eu desenvolvi duas classes para realizar toda manipulação possível com xml, a que faz a inserção de forma incremental acabei utilizando outros meios ao invés de utilizar JDom, claro que poderíamos fazer tudo utlizando JDom, com um pouco mais de estudo desenvolver uma única classe de uma maneira mais direta e com menos “gambiarras” do que estas que eu fiz…

Segue abaixo o link com as postagens.

http://www.guj.com.br/posts/list/82544.java

Espero ter lhe ajudado a resolver esta questão. Um abraço.!

Boa tarde FogLiato,

Eu li sua excelente postagem sobre manutenção em arquivo XML aqui no GUJ, meus parabéns.

Sou iniciante no Java X ICEFaces, e não estou conseguindo executar teu código de exemplo.
Estou tentando disparar seu código através de uma ACTION de um botão em minha página, mas infelizmente não estou obtendo êxito. 

Você ou algum colega aqui do forum poderiam me ajudar a enxergar onde estou errando ????

Veja os códigos de Exemplo :

Este é o código do botão na página:

    public String button1_action() {
        new Manipularquivo();
    }

Eis o seu código que copiei :

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.jdom.*;
import org.jdom.output.XMLOutputter;

/**
 *
 * @author 
 */
public class Manipulararquivo {

    public String caminho = "c:/TESTE.xml";
    public File arq = new File(caminho);

    /** Creates a new instance of Manipularquivo */
    public CriarArquivoXML() {
         //verifica a existência do arquivo, se não existir um novo arquivo é criado
        if (!arq.exists()) {
            boolean rcria = cria_arquivo();
        }
    }

    public boolean cria_arquivo() {
        try {
            //criando estrutura do arquivo xml
            Element encomendas = new Element("encomendas");
            //Define encomendas como root
            Document documento = new Document(encomendas);
            //Classe responsável para imprimir / gerar o XML
            XMLOutputter xout = new XMLOutputter();
            //Criando o arquivo de saida
            FileWriter arquivo = new FileWriter(new File(caminho));
            //imprimindo o XML no arquivo
            xout.output(documento, arquivo);
            return true;
        } catch (IOException e) {
            return false;
        }
    }

    //SIMPLESMENTE DESEJAMOS AQUI INCLUIR NOVOS REGISTROS  PERTECENTES AO ELEMENT ROOT
    public boolean grava_dados(String id, String local, String status, String datahora) {

        Element encomendas = new Element("encomendas");

        //Define encomendas como root
        Document documento = new Document(encomendas);

        //ATRIBUINDO VALORES AS TAGS QUE COMPÕE A ENCOMENDA
        Element encomenda = new Element("encomenda");
        encomenda.setAttribute("id", id);
        Element localizacao = new Element("localocalizacao");
        localizacao.setText(local);
        Element estado = new Element("estado");
        estado.setText(status);
        Element momento = new Element("momento");
        momento.setText(datahora);

        //ADICIONAR OS ELEMENTES PERTENCENTES A ENCOMENDA
        encomenda.addContent(localizacao);
        encomenda.addContent(estado);
        encomenda.addContent(momento);

        //adicionando a encomenda em encomendaS
        //encomendas.addContent(encomenda);
        XMLOutputter xout = new XMLOutputter();
        boolean resultado = true;
        try {
            FileWriter dados = new FileWriter(caminho);
            //Imprimindo o XML no arquivo
            xout.output(documento, dados);

            //ACIMA NA VERDADE NÃO PRECISAMOS CRIAR UM NOVO ARQUIVO DE SAIDA E
            //SIM DESCOBRIR SIMPLESMENTE UM MODO DE INSERIR UM NOVO REGISTRO
        } catch (IOException e) {
            resultado = false;
        }
        return resultado;
    }
}

Olha, as aplicações JAVA na qual utilizei estas classes rodavam em linux. Lembro que tentei utilizá-las em windows e tive algumas complicações para adaptá-las, como já faz muito tempo que não meto a mão nisso não me lembro…
Você baixou as minhas classes prontas presentes no post: http://www.guj.com.br/posts/list/82544.java ?

Eu tenho uma versão mais atualizada de tais classes na qual utilizei no meu trabalho de graduação, com alteração e tudo funcionando… Qualquer coisa, me envie um e-mail solicitando tais classes que te envio numa boa.

Um forte abraço!

Dei uma lida no DB2, BD da IBM, em particular a parte do pure XML. Ele permite mexer só nos nós que vc quer utilizando SQL ou XPath, ou até os dois. Aqui vc acha alguns materiais sobre isso e algumas classes de manipulaçao de XML.
Além disso, recomendo para leitura de xml o JColtrane (Aproveitando pra fazer uma propaganda) :smiley:

Olá pessoal,

  Obrigado pelas respostas.

   Realmente não é nada fácil trabalhar com XML no java. 

   Se alguém tiver mais alguma sugestão, por favor, poste aqui pois ficaremos muito felizes.

   Para o amigo Fogliato, já te enviei um e-mail conforme sugestão.

Abraço a todos

Uma dica, para criação de uma classe que alterasse o xml, poderia ser usado o JColtrane para fazer condições dificies e complexas a serem executadas nos nós.