XML com Java Condição While ou For [RESOLVIDO]

14 respostas
P

Pessoal,

Eu estou com a classe abaixo onde eu gero um arquivo XML, só que não estou conseguindo deixar vários registros no mesmo arquivo… só consigo gravar o último, pois ele sobre poem um ao outro, falta um while ou um for sei la… só que tentei colocar mas mesmo assim ele fica sobrepondo… alguem poderia me ajudar?

package br.com.localizador;

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

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;

public class GeradorXML {

	public void geraXML(String latitude, String longitude, String descr) {
		Document doc = new Document();
		XMLOutputter xout = new XMLOutputter();
		
		Element markers = new Element("markers");
		Element marker = new Element("marker");

		// "Setando" os atributos
		marker.setAttribute("lat", latitude);

		// "Setando" outro atributo agora utilizando da classe Attribute
		Attribute prioridade = new Attribute("lng", longitude);
		marker.setAttribute(prioridade);

		// "Setando" outro atributo agora utilizando da classe Attribute
		Attribute descricao = new Attribute("descr", descr);
		marker.setAttribute(descricao);

		markers.addContent(marker);

		// Criando o documento XML (montado)
		doc.setRootElement(markers);
		
		
		try {
			// Criando o arquivo de saida
			FileWriter aquivo = new FileWriter("c://arquivoXML.xml");
			// Imprimindo o XML no arquivo
			xout.output(doc, aquivo);
			System.out.println("Arquivo XML Gerado");
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

14 Respostas

josemanzoli

Você está criando um arquivo novo com o mesmo nome toda vez que executa o código.

Verifique se o arquivo já existe e ao invés de criar um novo, abra ele e inclua os novos registros no mesmo.

Rodrigo_Sasaki

Ou dê uma lida na documentação, que pode ter uma solução muito mais simples.

josemanzoli

Um problema aí é que ele quer inserir provavelmente tags marker dentro da root markers e escrevendo sempre no final do arquivo não vai dar certo.

206source

faz um for ou use o horário para gerar o nome do arquivo a cada execução simples… concatene isso ao nome.

P

josemanzoli
É isso mesmo… quero gerar vários maker dentro do makers

Só que já tentei colocar while e for, e não to conseguindo… mesmo assim eel sai e sobrescreve…

Não sei o que fazer… quero gerar um arquivo com vários “maker” dentro do “makers”

josemanzoli

http://www.guj.com.br/java/82544-inserir-editar-excluir-e-pesquisar-em-um-xml

http://www.guj.com.br/java/12782-alterar-valor-de-tag-xml

http://www.guj.com.br/java/238336-editar-arquivo-xml-com-java

http://javafree.uol.com.br/topic-883541-Leitura-de-arquivo-XML-Resolvido.html

http://javafree.uol.com.br/topic-878524-Como-inserir-uma-tag-de-um-arquivo-XML-dentro-de-outro-arquivo-XML.html

P

Valeu jose… mas não estou conseguindo usar estes exemplos… vou dar umas pesquisadas…

josemanzoli

Não dá para eu testar seu código agora, senão te enviava alguma coisa!

P

Valeu cara…

Eu to apanhando muito disso… não consigo colocar uma condição viável para ele incrementar tudo e só depois fechar o makers e gerar o arquivo…

josemanzoli

você tem que usar o jdom?

P

Mudei a lógica, e adicionei onde pega os valores da planilha, e coloquei dentro do FOR dele, assim funcionou:

package br.com.localizador;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.demo.XML;
import jxl.read.biff.BiffException;

public class GeradorXML {
	private static final int LINHA_INICIAL = 1;
	private Workbook workbook;
	private Sheet sheet;

	public GeradorXML(File vr) throws Exception,
			IOException, BiffException, ClassNotFoundException, SQLException {
		this.workbook = Workbook.getWorkbook(vr);
		this.sheet = workbook.getSheet(0);
		VerificadorCtr(vr);
	}

	public void VerificadorCtr(File vr) {
		int nuLinhas = sheet.getRows();
		Document doc = new Document();
		Element markers = new Element("markers");
		for (int nuLinhaAtual = LINHA_INICIAL; nuLinhaAtual < nuLinhas; nuLinhaAtual++) {
			LatitudeLongitude ctr = carregarLinha(nuLinhaAtual);


					String descricao = Integer.toString(nuLinhaAtual);
					String latitude = ctr.getLatitude().replace(",",".");
					String longitude = ctr.getLongitude().replace(",",".");
					
					Element marker = new Element("marker");

					// "Setando" os atributos
					marker.setAttribute("lat", latitude);

					// "Setando" outro atributo agora utilizando da classe Attribute
					Attribute prioridade = new Attribute("lng", longitude);
					marker.setAttribute(prioridade);

					// "Setando" outro atributo agora utilizando da classe Attribute
					Attribute descr = new Attribute("descr", descricao);
					marker.setAttribute(descr);

					markers.addContent(marker);

					// Criando o documento XML (montado)
					doc.setRootElement(markers);
								       
					System.out.println("inserindo coordenadas: " + " Latitude: "+ latitude + " Longitude: " + longitude + " Linha: "+ descricao);
				
		
		}
		
		XMLOutputter xout = new XMLOutputter();       

        try {
              //Criando o arquivo de saida
              FileWriter arquivo = new FileWriter(new File("C://ArquivoXML.xml"));

              //Imprimindo o XML no arquivo
              xout.output(doc, arquivo);

        } catch (IOException e) {
              e.printStackTrace();
        }   
	}

	private LatitudeLongitude carregarLinha(int nuLinhaAtual) {
		ValoresPlanilhaEnum planilhaEnum = null;
		LatitudeLongitude linhaRelatorio = new LatitudeLongitude();
		Cell[] celulas = sheet.getRow(nuLinhaAtual);

		for (int nuCelulaAtual = 0; nuCelulaAtual < celulas.length; nuCelulaAtual++) {
			Cell celula = celulas[nuCelulaAtual];
			CelulasEnum celulaXML = CelulasEnum
					.obterCelula(nuCelulaAtual);

			switch (celulaXML) {
			case LATITUDE:
				linhaRelatorio.setLatitude(celula.getContents());
				break;
			case LONGITUDE:
				linhaRelatorio.setLongitude(celula.getContents());
				break;
			}
		}

		return linhaRelatorio;
	}

}
josemanzoli

taí cara! se tiver dúvidas me avise.

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.ArrayList;

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

public class GeradorXML {
	
	public static void main(String args[]){
		ArrayList<Marker> list = new ArrayList<Marker>();
		list.add(new Marker("1","2","bla"));
		list.add(new Marker("3","4","ble"));
		list.add(new Marker("5","6","bli"));
		GeradorXML.geraXML(list);
	}
  
    public static void geraXML(ArrayList<Marker> markerList) {  
    	FileInputStream file = null;
    	FileWriter arquivo = null;
    	Document doc = null;
    	Element markers = null;
    	boolean fileExists = false;
    	
    	try {
    		file = new FileInputStream("C:\\Users\\T35332\\Documents\\ArquivoXml.xml");
    		doc = getDocument(file);
    		markers = (Element)doc.getElementsByTagName("markers").item(0);
    	}catch(FileNotFoundException f){
    		doc = getDocument(null);
    		markers = doc.createElement("markers");
    		fileExists = true;
    	}
        
        for (Marker m : markerList){
        	Element marker = doc.createElement("marker");  

        	marker.setAttribute("lat", m.getLatitude());  
      
            marker.setAttribute("lng", m.getLongitude());  
      
            marker.setAttribute("descr", m.getDescricao()); 
        	markers.appendChild(marker);
        }
        if (fileExists){
        	doc.appendChild(markers);
        }
          
        try {
    		arquivo = new FileWriter("C:\\Users\\T35332\\Documents\\ArquivoXml.xml");
            arquivo.write(docToString(doc));
            arquivo.close();  
            System.out.println("Arquivo XML Gerado");  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
  
    }
    
    public static Document geraMarker(Marker markerObj){
    	Document doc = getDocument(null);
    	
        return doc;
    }
    
    private static Document getDocument(InputStream file){
    	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    	DocumentBuilder builder = null;
    	Document doc = null;
		try {
			builder = factory.newDocumentBuilder();
			if (file == null){
				doc = builder.newDocument();
			}else{
				doc = builder.parse(file);
			}	
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return doc;
    }
    
    public static String docToString(Document doc) {
        DOMSource domSource = new DOMSource(doc);
        StringWriter writer = new StringWriter();
        StreamResult result = new StreamResult(writer);
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = null;
		try {
			transformer = tf.newTransformer();
			transformer.transform(domSource, result);
		} catch (TransformerConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        
        return writer.toString();
    }
}
public class Marker{
    	private String latitude;
    	private String longitude;
    	private String descricao;
    	
    	public Marker(){
    		
    	}
    	
    	public Marker(String latitude, String longitude, String descr){
    		this.latitude = latitude;
    		this.longitude = longitude;
    		this.descricao = descr;
    	}
    	
		public String getLatitude() {
			return latitude;
		}
		public void setLatitude(String latitude) {
			this.latitude = latitude;
		}
		public String getLongitude() {
			return longitude;
		}
		public void setLongitude(String longitude) {
			this.longitude = longitude;
		}
		public String getDescricao() {
			return descricao;
		}
		public void setDescricao(String descricao) {
			this.descricao = descricao;
		}
    }
P

Valeu jose… valeu mesmo pela força… está ótimo

josemanzoli

Eu usei o org.w3c.dom, se ajudou maravilha! Bons estudos!

Criado 17 de dezembro de 2012
Ultima resposta 18 de dez. de 2012
Respostas 14
Participantes 4