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.
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…
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());