Cadastro em arquivo xml

3 respostas
paulovittor23

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

3 Respostas

T

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.
paulovittor23

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:

paulovittor23

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);
		
	}
Criado 14 de novembro de 2006
Ultima resposta 14 de nov. de 2006
Respostas 3
Participantes 2