XML XStream - ler atributo

Pessoal,

Baixei o XStream 1.1.3 (versão estável) e estava usando e gostando bastante. Depois de ler Xml usando tags simples fui tentar ler uma pegando o valor de um atributo de uma delas e não consegui. No tutorial do site existe um método aliasAttribute() e no meu objeto esse método não aparece de forma alguma.

Alguém sabe como ler o valor de um atributo de uma tag usando o XStream (1.1.3)?

Xml que funciona:

  <evento> 
    <codigo>101</codigo>   
    <descricao>Inscrição de primeiro estabelecimento</descricao>
  </evento>

Xml que eu gostaria de usar:

  <evento codigo="101"> 
    <descricao>Inscrição de primeiro estabelecimento</descricao>
  </evento>

Tem alguns emails perguntando isso na mailing list deles. E a resposta é simples: eles não dão suporte built-in para leitura de atributos.

Se você não pode trabalhar do jeito que eles recomendam, terá que escrever seu próprio converter. Não é muito difícil, aqui um exemplo bobo para sacar como faz:

public class ComponentConverter implements com.thoughtworks.xstream.converters.Converter
{
	// transforma XML em Objetos
	public Object unmarshal( HierarchicalStreamReader reader,
			UnmarshallingContext context )
	{
		String type = reader.getNodeName();
		String codigo = reader.getAttribute( "codigo" );
		return null;
	}

	public boolean canConvert( Class type )
	{
		return type.equals( MyClass.class );
	}

	// transforma Objetos em XML
	public void marshal( Object source, HierarchicalStreamWriter writer,
			MarshallingContext context )
	{

	}
}

E para usar:

XStream xstream = new XStream();
xstream.registerConverter( new ComponentConverter() );

Leia a documentação das classes HierarchicalStreamReader, UnmarshallingContext, HierarchicalStreamWriter e MarshallingContext.

Oh amigo, parace que vc ta garrado no “Cadastro Sincronizado Nacional”.
Boa sorte ai fi

Ou voce pode fazer usando XSLT…

Dentro do dominio do seu app, usa da maneira do XStream, quando for fazer algo externo, passa um XSLT e pronto.

Tive um problema parecido: Um elemento do XML precisava da tag CDATA para comunicação externa e o serializador/deserializador que utilizei não colocava…

Minha solução foi essa.

public Object unmarshal( HierarchicalStreamReader reader, UnmarshallingContext context ) { String type = reader.getNodeName(); String codigo = reader.getAttribute( "codigo" ); return null; }

como eu cria uma nova instancia do objeto, se eu só consigo o nome da classe (String type) ?

Se alguém preciar usar o Xstream para imprimir uma tag da seguinte maneira:

Onde: TAG = ‘Sua classe’ e ‘attribute’ sendo o atributo String da sua classe…

você pode fazer assim, criando uma classe que modifica o obj…

[code]public class ModifyClass implements SingleValueConverter {

public String toString(Object obj) {
	return (String) obj;
}

public Object fromString(String atributoQueQuerMudar) {
	return atributoQueQuerMudar;
}

public boolean canConvert(Class type) {
	return type.equals(String.class);
}

}[/code]

depois no seu codigo você chama da seguinte maneira

SuaClasse suaClasse = new SuaClasse(); suaClasse.setUmAtributoStringQualquer("1"); xstream.alias("NOME DA TAG QUE VC QUER", SuaClasse.class); xstream.useAttributeFor(SuaClasse.class, "atributoQueQuerImprimir"); xstream.registerConverter(new ModifyClass());

Espero que seja util para alguem! :slight_smile:

1 curtida