GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Gerar arquivo XML


#1

Olá pessoal,

Preciso que meu software gere arquivos XML, porém eu não estou conseguindo.
Dei uma olhada nas APIs de IO, OutputStream e outros, mas não estou conseguindo.

Por exemplo, preciso gerar um arquivo parecido com esse, que outro software vai usar:

Alguém sabe como faço isso?
Obrigado!


#2

Olá

Você pode gerar esse arquivo normalmente como um arquivo texto. Exemplo
Agora se você quiser algo mais especifico para gerar/ler XML pode usar o JDOM.


#3

Outra alternativa bem legal é o XStream.


#4

Obrigado, fiz pelo primeiro exemplo e deu certo...
Só tenho uma dúvida, como vou editar sempre o mesmo arquivo da maneira do exemplo vai sendo acrescentado o texto no final do arquivo.
Toda vez que for gerar o arquivo preciso sobrepor o texto anterior, ou excluir o arquivo e criá-lo novamente.
Como faço isso??

Obrigado!


#5
Aqui vai um exemplo da criação de um arquivo XML com as classes DOM, que são classes nativas do java, sem precisar de usar APIs externas.

O Exemplo a seguite é a geração de uma NFe que estou fazendo atualmente, essa NFe, em outras palavras, é apenas um arquivo XML.

public static void generateXMLFile(NotaFiscalEletronica nfe, String savePath) throws IOException, Exception{		
			//Criar uma String no formato XML para o inicio da criação do arquivo.
			String xmlHeader;
			xmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";			
			xmlHeader += "\n<NFe xmlns=\"http://www.portalfiscal.inf.br/nfe\">";			
			xmlHeader += "\n</NFe>\n";			
			/*
			 * Cria um InputStream a partir do string "xmlHeader". Se você for parsiar("abrir") o XML
			 * de um arquivo .xml já existente então pegue o InputStream do File (arquivo) do qual 
			 * você esta lendo.
			 * */
			ByteArrayInputStream xml = new ByteArrayInputStream(new String(xmlHeader.getBytes(), "UTF-8").getBytes()); 
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder docBuilder = dbf.newDocumentBuilder();
			Document doc = docBuilder.parse(xml);
			//Pega o nó raís da árvore do XML.
			Element rootNode = doc.getDocumentElement();
			//Cria e adiciona o nó base da NFe no nó raís do XML.
			Element infNFe = doc.createElement("infNFe");			
			infNFe.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
			infNFe.setAttribute("Id", "NFe" + nfe.getDVChaveAcesso());
			infNFe.setAttribute("versao", String.valueOf(nfe.getVersao()));
			rootNode.appendChild(infNFe);
			//Inicia a adição dos demais nós que devem conter o XML de acordo com a NFe.
			generateHeaderNodes(nfe, doc, infNFe);
			//Salva o documento XML no diretório passado como parâmetro.			
			DOMSource source = new DOMSource(doc);
			StreamResult result = new StreamResult(new FileOutputStream(savePath + "zell.xml"));
			TransformerFactory transFactory = TransformerFactory.newInstance();
			Transformer transformer = transFactory.newTransformer();
			transformer.transform(source, result);		
	}
Quem quiser aprender mais ou tirar mais dúvidas de uma consultada nos seguintes artigos:

http://www.loiane.com/2009/04/manipulando-arquivos-xml-em-java-com-a-api-dom-parte-i/
http://www.loiane.com/2009/05/manipulando-arquivos-xml-em-java-com-a-api-dom-parte-ii/
http://www.loiane.com/2009/05/manipulando-arquivos-xml-em-java-com-a-api-dom-parte-iii/

Nota: Sei que estou atrasado na postagem, mas pode ser útil para pessoas que estão pesquisando o GUJ pelo google o/


#6

Ops... faltou um restinho de código =P

private static void generateHeaderNodes(NotaFiscalEletronica nfe, Document doc, Element root) throws Exception {
		Element ide = doc.createElement("ide");
		Element cUF		= doc.createElement("cUF");
		Element cNF		= doc.createElement("cNF");
		Element natOp	= doc.createElement("natOp");
		cUF.setTextContent(String.valueOf(nfe.getCodUFEmitente()));
		cNF.setTextContent(nfe.getCodChaveAcesso());
		natOp.setTextContent(nfe.getNaturezaOperacao());
		ide.appendChild(cUF);
		ide.appendChild(cNF);
		ide.appendChild(natOp);
	}

O objeto NotaFiscalEletronica é só um object que guarda dados, mais nada o/


#7

Bom galera, seguinte, estou precisando fazer a leitura de um xml pela URL e pegar os valores que serão retornados para futuras consultas.

Algo do tipo:
Passaria a url "http://10.5.11.61/geri/wsgeri.ashx?user=usuario&pass=senha&spass=12315454"

E me retornaria um XML com uma estrutura parecida com essa :
view plaincopy to clipboardprint?

    <geri>  
    <usuario>  
       <nome>LEONARDO</nome>  
       <login>999999</login>  
       <trocasenha>False</trocasenha>  
       <perfil>Nomeperfil</perfil>  
    </usuario>  
    <sistema>  
       <modulo id="14" nome="relvolumetria" funcionalidade="visualizacao"/>  
       <modulo id="19" nome="relvolumetriavdn" funcionalidade="visualizacao"/>  
       <modulo id="41" nome="relwfmaderencia" funcionalidade="visualizacao"/>  
    </sistema>  
    </geri>

E ai gravaria as "colunas" filtrando por exemplo os modulos do sistema em um List ou ArrayList.


#8

Eu iria de XStream tbm. =)


#9

Ola Leopose =)

Olha, você pode fazer isso facilmente criando um Document DOM. Abaixo vou deixar um código exemplo.

                String stringXML = "Essa string deve ser o seu XML.";
		ByteArrayInputStream in = new ByteArrayInputStream(new String(stringXML.getBytes(), "UTF-8").getBytes()); 
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = dbf.newDocumentBuilder();
		Document xml = builder.parse(in);
		Element root = xml.getDocumentElement();
		Element node = (Element) root.getElementsByTagName("usuario").item(0);
                //Daqui pra frente é só fazer a leitura normal do XML conforme eu já postei acima neste tópico =)

Espero ter ajudado!
Abraço!


#10

Obrigado pela inicitiava Zell !

Ajudou muito!


#11
Thanks Elsino! Estamos sempre ai pra isso =)


Abraço! o/

#12