Cadastro em arquivo xml

Estou desenvolvendo uma aplicação para um trabalho da faculdade e estou com problemas para armazenar “registros” de cadastros.

Não sei como inserir o novo registro no lugar correto no xml

minha intenção era que ficasse assim:

<?xml version="1.0" encoding="UTF-8"?>
<movimentacao>

  <locacao id="10">
    <cliente>10</cliente>
    <titulos>1;2;</titulos>
    <quantidades>1;1;</quantidades>
    <dtretirada>05/10/2006</dtretirada>
    <dtdevolucao>15/10/2006</dtdevolucao>
  </locacao>

  <locacao id="11">
    <cliente>12</cliente>
    <titulos>2;3;</titulos>
    <quantidades>1;1;</quantidades>
    <dtretirada>05/10/2006</dtretirada>
    <dtdevolucao>15/10/2006</dtdevolucao>
  </locacao>

</movimentacao>
<?xml version="1.0" encoding="UTF-8"?>

porém meu método gera assim :

<?xml version="1.0" encoding="UTF-8"?>

<movimentacao>
  <locacao id="10">
    <cliente>10</cliente>
    <titulos>1;2;</titulos>
    <quantidades>1;1;</quantidades>
    <dtretirada>05/10/2006</dtretirada>
    <dtdevolucao>15/10/2006</dtdevolucao>
  </locacao>
</movimentacao>

<?xml version="1.0" encoding="UTF-8"?>

<movimentacao>
  <locacao id="10">
    <cliente>10</cliente>
    <titulos>1;2;</titulos>
    <quantidades>1;1;</quantidades>
    <dtretirada>05/10/2006</dtretirada>
    <dtdevolucao>15/10/2006</dtdevolucao>
  </locacao>
</movimentacao>

Minha Classe de teste que faz essa magavilha é a seguinte :

ppackage xml;

import java.io.FileWriter;
import java.io.IOException;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class ManipulaXML {
	
	public static void main(String[] args) {
		ManipulaXML manipulaXML = new ManipulaXML();
		try {
			manipulaXML.insere(manipulaXML.createDocument());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public Document createDocument() {
        Document document = DocumentHelper.createDocument();
        
        //Element subRoot = document.addElement( "locacao" );
        
        Element root = document.addElement( "movimentacao" );
        Element subRoot = root.addElement( "locacao" ).addAttribute("id", "10");
              
        @SuppressWarnings("unused")
		Element cliente = subRoot.addElement( "cliente" ).addText( "10" );
        @SuppressWarnings("unused")
		Element titulos = subRoot.addElement( "titulos" ).addText( "1;2;" );
        @SuppressWarnings("unused")
		Element quantidades = subRoot.addElement( "quantidades" ).addText( "1;1;" );
        @SuppressWarnings("unused")
		Element dtretirada = subRoot.addElement( "dtretirada" ).addText( "05/10/2006" );
        @SuppressWarnings("unused")
		Element dtdevolucao = subRoot.addElement( "dtdevolucao" ).addText( "15/10/2006" );
                       
        return document;
    }

	public void insere(Document document) throws IOException {

        // lets write to a file
		OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer = new XMLWriter(
            new FileWriter( "output.xml", true ), format
        );
        writer.write( document );
        writer.close();

        writer = new XMLWriter( System.out, format );
        writer.write( document );
    
    }

}

Creio que alguém já deva ter tido o mesmo tipo de problema, então se puder dar alguma ajuda como indicar outras maneiras para inserir no xml, ou um exemplo ficaria agradecido…

Tnks

Isto está efetuando um “append” no arquivo, que não é o que você quer. No caso de XML você tem de fazer o seguinte:

  • Ler o arquivo XML, construindo um XML Document
  • Inserir os tags adequados
  • Gravá-lo de volta.

Então thingol eu sei q o problema está neste append :frowning: mas como não encontrei nenhum exemplo que faça esse append da maneira correta fiz assim p ter um começo rs…

o q eu precisava eh algum exemplo, independente da API usada, mas que pudesse me dar um norte…

agradeço pela atenção :smiley:

Bom eu consegui resolver o problema da inserção como append…

to postando o código aqui e, se não for muito trabalhoso gostaria que alguém pudesse fazer um tutorial p deixar disponibilixado p quem tiver a msm dúvida q eu tive…

ps: vlw pela ajuda thingol 8)

package classes;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class Xml {

	public static void main(String[] args) {
		Xml xml = new Xml();
		System.out.println("Id gerado = " + xml.geraIdLocacao());
		xml.insere();
	}
	
	public void insere(){
		DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder docBuilder = null;
		Document doc = null;;
		
		try {
		
			docBuilder = docFactory.newDocumentBuilder();
			doc = docBuilder.parse("output.xml");
			
		} 
		catch (ParserConfigurationException e) { e.printStackTrace();	} 
		catch (SAXException e) { e.printStackTrace(); } 
		catch (IOException e) {	e.printStackTrace(); }
		
		Node movimentacao = doc.getFirstChild();
						
		Node locacao = doc.createElement("locacao");
		Attr idLocacao = doc.createAttribute("id");
		idLocacao.setValue("" + geraIdLocacao());
		NamedNodeMap locacaoAttributes = locacao.getAttributes();
		locacaoAttributes.setNamedItem(idLocacao);
				
		Node cliente = doc.createElement("cliente");
		cliente.setTextContent("1");
		
		Node titulos = doc.createElement("titulos");
		titulos.setTextContent("1;2;");
		
		Node quantidades = doc.createElement("quantidades");
		quantidades.setTextContent("1;1;");
		
		Node dtretirada = doc.createElement("dtretirada");
		dtretirada.setTextContent("10/05/2006");
		
		Node dtdevolucao = doc.createElement("dtdevolucao");
		dtdevolucao.setTextContent("20/05/2006");
		
		locacao.appendChild(cliente);
		locacao.appendChild(titulos);
		locacao.appendChild(quantidades);
		locacao.appendChild(dtretirada);
		locacao.appendChild(dtdevolucao);
		
		movimentacao.appendChild(locacao);
		
		Transformer transformer = null;
		
		try {
			transformer = TransformerFactory.newInstance().newTransformer();
		} 
		catch (TransformerConfigurationException e1) { e1.printStackTrace(); } 
		catch (TransformerFactoryConfigurationError e1) { e1.printStackTrace(); }
		
		transformer.setOutputProperty(OutputKeys.INDENT, "yes");
		//initialize StreamResult with File object to save to file
		StreamResult result = null;
		
		try {
			result = new StreamResult(new FileWriter(new File("output.xml")));
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		
		DOMSource source = new DOMSource(doc);
		
		try {
			transformer.transform(source, result);
		} 
		catch (TransformerException e) { e.printStackTrace(); }
		
		String xmlString = result.getWriter().toString();
		System.out.println(xmlString);
		
	}