[RESOLVIDO]Gravar em XML sem apagar o que havia - XStream

5 respostas
G

Olá,

Estou tendo problemas pra gravar em um arquivo XML, até que consigo gerar o arquivo, mas ele sempre apaga o que tinha antes pra salvar o atual. Alguma idéia de como posso resolver essa pendenga. Segue o código da classe que estou usando:

public static void gerarXml(Local local) throws FileNotFoundException {
        XStream xStream = new XStream();
        //Usamos o método que detecta as classes anotadas
        xStream.autodetectAnnotations(true);
        
        String documento = xStream.toXML(local);
        salvarArquivo(xStream.toXML(local), "localXml.xml");
    }

    private static void lerXmlAnnotation() {
        FileReader reader = null;
        try {
            //carrega o arquivo XML para um objeto reader
            reader = new FileReader(
            "C:\\DengueXMLArquivos\\localXml.xml"
            );
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        //Cria o objeto xstream
        XStream xStream = new XStream(new DomDriver());
        //Para ler vamos utilizar outro método o
        //processAnnotations() e como parâmetro passamos
        //a classe que possui as anotações
        xStream.processAnnotations(Local.class);

        Local local = (Local) xStream.fromXML(reader);
        System.out.println(local.toString());
    }
	
    private static void salvarArquivo(String documento, String file) {
        File path = new File("C:\\DengueXMLArquivos\\" + file);
        try {
            PrintWriter writer = new PrintWriter(path);
            writer.println(
            "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"no\"?>"
            );           
            writer.println(documento);
            writer.flush();
            writer.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }     

    }

5 Respostas

R

Uma sugestão, você pode concatenar uma data no nome de seu arquivo, assim ele irá gravar um arquivo com outro nome e não irá sobrescrever. Por exemplo nomeArquivo + uma data no formato yyyy.MM.dd_hh.mm.ss

G

Rodrigo Oliveira, obrigado pela dica, mas não é bem isso que eu quero. Se eu seguir seu conselho terei um número de arquivos xml igual a quantiade de vezes que salvar instancias da classe de Dominio. O que preciso é dar um jeito de apenas acrescentar as novas informações ao XML que tenho. Algo como deserializar e serializar novamente, incluindo os novos dados. Lembrando que estou usando XStream, mas se alguem tiver uma solução parecida será útil tb.

R

Entendi, essa deve ser a unica forma mesmo. Se vc for fazer dessa forma e tiver problemas, posso te ajudar.

J

Porque vc não deserializa, altera o que quer e grava novamente?

Depois de vc ler o conteúdo do arquivo é so fazer um:

Seu_Objeto obj = xstream.fromXML(conteudo_do_arquivo)
G

Já há algum tempo resolvi este problema e estou passando aqui para mostrar qual a solução encontrada e ajudar, caso alguém apresente problema semelhante. Não sei se a solução foi a mais elegante ou a melhor em termos de desempenho, mas pro meu caso resolveu.

Antes de salvar o XML eu salvo o objeto no banco e logo após eu faço uma busca e atribuo a uma list:

List<Local> locais= new ArrayList<Local>();
for (Local local : localNegocio.buscarTodos()) {
			locais.add(local);
		}

Depois eu serializo os dados passando a list atual e salvo o XML, substituindo o antigo:

XStream x = new XStream();
x.autodetectAnnotations(true);
x.alias("local", Local.class);

String xml = x.toXML(locais);
System.out.println(xml);
salvarArquivo(xml, "local.xml");

Se alguém tiver o mesmo problema e tiver alguma dúvida é só mandar. Valeu.

Criado 16 de agosto de 2011
Ultima resposta 19 de set. de 2011
Respostas 5
Participantes 3