XStream - Limitações

9 respostas
Robertdm

Pessoal.
Tenho precisado trabalhar com xml em java então busquei bibliotecas para tal. Li sobre XStream e comecei a utilizar sendo que foi super tranquilo na conversão de java para xml, porém o contrário está me causando problemas. Consigo converter xmls que tenham um nodo raiz e vários filhos com atributos únicos como por exemplo esse:

1 Robert 2 Fernando 3 Magali

Gero tranquilamente um List. O problema que estou encontrando é em converter um xml com filhos que tenham netos como por exemplo esse:

1 turma1 1 Nome1 11 Nome11 2 turma2 2 Nome2 22 Nome22

Onde eu tenho uma List sendo que cada turma possui um List além dos atributos id e nome.

O problema geral que estou enfrentando está em como devo fazer pra ler um xml que tenha filhos, netos, etc…independente de quantos forem entende?

Gostaria de saber se alguém já trabalhou com algo assim e saberia como fazer para ler e transformar em objetos java?

Já tentei muitas coisas e li em muitos lugares mas não encontrei nada específico.

Agradeço muito a atenção e fico no aguardo de uma possível resposta.

9 Respostas

A

Bom trabalhar com o XStream é muito fácil, para vc transformar o seu xml em questão em objetos, vc deve ter a mesma estrutura em objetos do seu XML

Por exemplo: O seu objeto Turma vai ter uma collection de Aluno.

Se vc querer gerar nodos filhso de Aluno, como por exemplo telefone dele (que pode ser composto), vc pode colocar uma collection Telefone no objeto Aluno e assim sucessivamente…

em geral tem que montar a mesma arvore de objetos que vc tem em seu XML.

Espero que fui claro

E

Um caso clássico em que você tem algo com um número indefinido de níveis é uma listagem de diretório.

Nesse caso, é aconselhável você usar DOM (e talvez XPath) mesmo.

davidbuzatto

Então, eu ainda não entendo pq todo mundo indica o XStream.
Já tive tantos problemas com o XStream que é bom nem começar a falar…
Existe a possibilidade de você usar outra biblioteca? Recomendo a Simple XML http://simple.sourceforge.net/.

[]´s

Robertdm

anderson_lp789

public class TurmaAlunos {

private int id;

private String nome;

private List alunos;

}
public class Aluno {

private int id;

private String nome;

}

List turmasAlunos = null;

XStream x = new XStream();

x.alias(turma, TurmaAlunos.class);

x.alias(aluno, Aluno.class);

turmasAlunos = (List) x.fromXML(stream);

Essa é a estrutura que eu estava testando antes de postar e da forma como estava fazendo para converter (só omiti os getters e setters) mas não rolou. Tu poderia me axuliar se meu código está correto?

Obrigado

Robertdm

davidbuzatto

Esta biblioteca que me indicou, como faço pra usar ela no netbeans ou eclipse?

Obrigado

A
Robertdm:
anderson_lp789

public class TurmaAlunos {
private int id;
private String nome;
private List alunos;
}

public class Aluno {
private int id;
private String nome;
}

List turmasAlunos = null;

XStream x = new XStream();
x.alias("turma", TurmaAlunos.class);
x.alias("aluno", Aluno.class);
turmasAlunos = (List) x.fromXML(stream);

Essa é a estrutura que eu estava testando antes de postar e da forma como estava fazendo para converter (só omiti os getters e setters) mas não rolou. Tu poderia me axuliar se meu código está correto?

Obrigado

Bom eu testei aqui e aparentemente você tudo corretamente... só se o stream seu não for um tipo válido... bom eu fiz um teste aqui, espero que ajude:
List<TurmaAlunos> turmasAlunos = new ArrayList<TurmaAlunos>(); 

		TurmaAlunos um = new TurmaAlunos();
		um.setId(1);
		um.setNome("turma 1");
		

		TurmaAlunos dois = new TurmaAlunos();
		dois.setId(2);
		dois.setNome("turma 2");		
		
		Aluno alunoUm = new Aluno();
		alunoUm.setId(1);
		alunoUm.setNome("anderson");
		
		Aluno alunoDois = new Aluno();
		alunoDois.setId(2);
		alunoDois.setNome("anderson1");
		
		Aluno alunoTres = new Aluno();
		alunoTres.setId(3);
		alunoTres.setNome("anderson2");
		
		List<Aluno> alunos = new ArrayList<Aluno>();
		alunos.add(alunoUm);
		alunos.add(alunoDois);
		
		List<Aluno> alunos2 = new ArrayList<Aluno>();
		alunos2.add(alunoTres);
		
		um.setAlunos(alunos);
		dois.setAlunos(alunos2);
		
		turmasAlunos.add(um);
		turmasAlunos.add(dois);
		
		XStream x = new XStream(); 
		x.alias("turma", TurmaAlunos.class); 
		x.alias("aluno", Aluno.class); 
		
		System.out.println(x.toXML(turmasAlunos));
		String xml = x.toXML(turmasAlunos);
		
		List<TurmaAlunos> turmasAlunos2 = null;
		turmasAlunos2 = (List<TurmaAlunos>) x.fromXML(xml); 
		
		for (int j = 0; j < turmasAlunos2.size(); j++)
			System.out.println("Nomes da turma são:" + turmasAlunos2.get(j).getNome());
davidbuzatto

Robertdm:
davidbuzatto

Esta biblioteca que me indicou, como faço pra usar ela no netbeans ou eclipse?

Obrigado

Baixe a biblioteca, descompacte, crie uma biblioteca no netbeans e aponte para todos .jars que vierem no pacote.
Depois de criar a biblioteca, insira no projeto.

[]´s

Robertdm

Como você citou na sua resposta, realmente o problema era com o meu stream. Ele estava mal formado o que gerava o erro na hora da conversão.

Agradeço a atenção e a rapidez com que postou as respostas de ajuda.

Por mim o post pode ser fechado/encerrado, pois o caso foi solucionado.

Grande abraço.

Robertdm

Então uso ela assim como a própria XStream, tranquilo.

Vou tentar terminar o que estou fazendo com a XStream, mas caso não consiga vou experimentar utilizar a Simple XML.

Agradeço também pela atenção e a rapidez com que postou as respostas de ajuda.

Grande abraço.

Criado 15 de outubro de 2010
Ultima resposta 15 de out. de 2010
Respostas 9
Participantes 4