Transformar XML em um arquivo TXT

9 respostas
A

Salve galera,

Precisarei fazer um programa que receberá um arquivo xml padronizado e transforma-lo em um arquivo txt, onde as tags serão convertidos para coluna neste txt desprezando apenas o cabeçalho , estava pensando em usar o xstream , também pensei em fazer o meu próprio converter porém não pretendo perder muito tempo fazendo isto … o que vcs me aconselham a utilizar o XStream mesmo ou tem alguma lib melhor para fazer o que precciso?

Exemplo:

<cabeçalho>15/01/2011</cabeçalho>
<bla1>João</bla1>
<bla2>Maria</bla2>

Saida:bla1, bla2
joão, maria

Valeu…

9 Respostas

A

cara,

vc pode usar o xstream para converter seu xml em objeto java, depois é so vc montar o txt printwriter.

t+

V

XStream não lê fácil esses valores que estão dentro das tags, tem que fazer uns conversores feios

Mas você pode usar o JAXB que já vem no JDK, só tem um problema, seu XML é inválido

Um arquivo XML só pode ter um único elemento raiz. Segue um código que lê o XML com um elemento raiz adicionado
package guj;

import java.io.InputStream;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

@XmlRootElement(name="guj")
@XmlAccessorType(XmlAccessType.FIELD)
public class GUJ {
	
	public Cabecalho cabecalho;
	public Bla1 bla1;
	public Bla2 bla2;
	
	public void imprimir() {
		System.out.println("bla1, bla2");
		System.out.println(bla1.valor + ", " + bla2.valor);
	}
	
	public static class Cabecalho {
		@XmlValue public String valor;
	}
	
	public static class Bla1 {
		@XmlValue public String valor;
	}
	
	public static class Bla2 {
		@XmlValue public String valor;
	}

	public static void main(String[] args) throws Exception {
		InputStream input = GUJ.class.getResourceAsStream("/guj/GUJ.xml");
		JAXBContext context = JAXBContext.newInstance(GUJ.class);
		Unmarshaller unmarshaller = context.createUnmarshaller();
		GUJ result = (GUJ) unmarshaller.unmarshal(input);
		result.imprimir();
		input.close();
	}

}
<guj>
	<cabecalho>15/01/2011</cabecalho>
	<bla1>João</bla1>
	<bla2>Maria</bla2>
</guj>
V

Se precisar ler aquele XML inválido seu me avisa que faço umas Regexps

A

para fazer isso com xstream nao precisa fazer conversor nao, basta criar uma entidade com as propriedades das tags e pronto.
nao vejo nada de complicado nisso.

t+

V

Os valores estão dentro das tags

Eu tentei usar XStream há pouco tempo pra ler algo assim e não consegui. Atributo ele só lê se estiver dentro da tag ()

Se eu estiver errado me corrija

W

Não precisa de conversor victorcosta. A própria documentação do XSTream usa atributos fora da tag:

http://xstream.codehaus.org/tutorial.html

Falou!

V

É verdade, eu que viajei pq quando precisei disso era em caso mais complicado

Era uma lista de tags, e cada tag tinha atributos da tag e um atributo no corpo, algo assim:

<tags>
    <tag atributo1="valor1" atributo2="valor2">valor</tag>
    <tag atributo1="valor1" atributo2="valor2">valor</tag>
</tags>

Como não consegui no XStream mudei pro JAXB pq tem o @XMLValue

De qualquer forma segue o código com XStream, mais enxuto

package guj;

import java.io.InputStream;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias("guj")
public class GUJ {
	
	public String cabecalho;
	public String bla1;
	public String bla2;
	
	public void imprimir() {  
        System.out.println("bla1, bla2");  
        System.out.println(bla1 + ", " + bla2);  
    }  

	public static void main(String[] args) throws Exception {
		InputStream input = GUJ.class.getResourceAsStream("/guj/GUJ.xml");
		XStream xstream = new XStream();
		xstream.processAnnotations(GUJ.class);
		GUJ guj = (GUJ) xstream.fromXML(input);
		guj.imprimir();
		input.close();
	}

}
V

E vendo agora, é desnecessário as classes extras no JAXB

package guj;

import java.io.InputStream;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="guj")
@XmlAccessorType(XmlAccessType.FIELD)
public class GUJ {
	
	public String cabecalho;
	public String bla1;
	public String bla2;
	
	public void imprimir() {
		System.out.println("bla1, bla2");
		System.out.println(bla1 + ", " + bla2);
	}

	public static void main(String[] args) throws Exception {
		InputStream input = GUJ.class.getResourceAsStream("/guj/GUJ.xml");
		JAXBContext context = JAXBContext.newInstance(GUJ.class);
		Unmarshaller unmarshaller = context.createUnmarshaller();
		GUJ result = (GUJ) unmarshaller.unmarshal(input);
		result.imprimir();
		input.close();
	}

}
A

Bom dia, para todos que responderam o meu muito obrigado.

[list]victorcosta,wagnerfrancisco,alissonvla[/list]

Criado 30 de novembro de 2011
Ultima resposta 1 de dez. de 2011
Respostas 9
Participantes 4