Xtream: Como ignorar valores do xml na hora do load

6 respostas
quebrado

Boa tarde pessoal!
Estou usando xstream para ler um xml antigo e adaptar ao novo formato onde o xstream esta rodando corretamente.
Mas quando vou carregar este xml antigo aparece varios erros medonhos.
Queria ver como faço para ignorar os valores antigos do xml usando o xstream.
Sei que tenho que usar a interface converter, mas vou ter que ler atributo por atributo e adequar ao novo xml.
Grato

6 Respostas

Pedrosa

Que erros medonhos são esses?

Veja se esse xml antigo abre corretamente em algum browser.

quebrado

o xml ta correto Pedrosa. no parse ele vem ok!
é que o meu objeto tem apenas alguns atributos do xml antigo. E o xstream reclama que o existem atributos a mais.
Eu queria ignorar o restante e recuperar apenas o que preciso. Sem ter que criar um objeto que representa-se todo o objeto antigo ja que ele é um pouco complexo e não tenho xsd dele.
Obrigado e t+

T

http://xstream.codehaus.org/faq.html#Serialization_newer_class_versions

quebrado

é… vou ter que fazer um converter na unha!
Obrigado e t+

peczenyj

O Conversor é super facil de criar.

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

Entretanto, dependendo do que vc quer fazer só criar os aliases corretos ja basta.

bmxer

Passei pelo mesmo problema, e criando o Conversor é possível ignorar algum elementos que não são mapeados.

A main tem alguns testes e no método converterFromXml você pode notar que há um elemento que não é mapeado.

http://rapidshare.com/files/214811547/xstreamConverter.jar.html

public class PessoaConverter implements Converter {

	public boolean canConvert(Class clazz) {
		return clazz.equals(Pessoa.class);
	}

	public void marshal(Object value, HierarchicalStreamWriter writer,
			MarshallingContext context) {

		Pessoa pessoa = (Pessoa) value;
		writer.startNode("nome");
		writer.setValue(pessoa.getNome());
		writer.endNode();
		writer.startNode("sobrenome");
		writer.setValue(pessoa.getSobrenome());
		writer.endNode();
		writer.startNode("endereco");
		context.convertAnother(pessoa.getEndereco());
		writer.endNode();
	}

	public Object unmarshal(HierarchicalStreamReader reader,
			UnmarshallingContext context) {
		Pessoa pessoa = new Pessoa();

		List<String> elm = new ArrayList<String>();

		elm.add(0, "nome");
		elm.add(1, "sobrenome");
		elm.add(2, "endereco");

		while (reader.hasMoreChildren()) {
			reader.moveDown();

			String tag = reader.getNodeName();
			int index = elm.indexOf(tag);

			switch (index) {
				case 0:
					pessoa.setNome(reader.getValue());
					break;
				case 1:
					pessoa.setSobrenome(reader.getValue());
					break;
				case 2:
					Endereco endereco = (Endereco)context.convertAnother(pessoa,Endereco.class);
					pessoa.setEndereco(endereco);
					break;
			}
			reader.moveUp();
		}

		return pessoa;

	}

}
Criado 25 de março de 2009
Ultima resposta 29 de mar. de 2009
Respostas 6
Participantes 5