Dúvida com XStream

16 respostas
R

Pessoal,

como faço para parsear com o XStream nessa situação:
1)Se eu tiver:

public class Pessoa {

   private List<Endereco> endereco
}
public class Endereco {
  private nome;
  private rua;
}

e no xml eu tenho:


xxx
xx

zzz yy

como faço pra q as tags virem elementos da minha Collection?

Abraços

16 Respostas

_fs

O ideal nessa situação seria se o xml ficasse assim:

<pessoa>
    <enderecos>
        <endereco>
            <nome>xxx</nome>
            <rua>xx</rua>
        </endereco>
        <endereco>
            <nome>zzz</nome>
            <rua>yy</rua>
        </endereco>
    </enderecos>
</pessoa>

E na classe a propriedade fosse chamada “enderecos”.

Você pode alterar o xml?

R

justamente… :lol:

o que acontece é que recebo o XML de um webservice que me retorna como mostrei:

<pessoa>
       <endereco> 
            <rua>xx</rua>
       </endereco>

       <endereco> 
            <rua>xx</rua>
       </endereco>
</pessoa>

assim não tem como?
Abraço

le-silva

Cara…

Tenta usar a anotação @XStreamImplicit.

R

Não posso usar Java 5… :cry:

le-silva

Dá pra fazer programaticamente…

Se não me engano é xstream.addImplicitCollection.

Tenta isso…

R
public class Main {

	public static void main(String[] args) {
		String xml   = "<?xml version='1.0' encoding='ISO-8859-1' standalone='yes'?>"+
		"<pessoa>"+
		<endereco><city>teste</city></endereco>"+
		"<endereco><city>xxx</city></endereco>"+
		"</pessoa>";
		try {
		XStream x = new XStream(new DomDriver());
		x.alias("person", Pessoa.class);
		x.alias("endereco", Endereco.class);
		
		x.addImplicitCollection(Endereco.class,"endereco");
		Pessoa p = (Pessoa)x.fromXML(xml);
		System.out.println(p);
		}catch(Exception e){
			e.printStackTrace();
		}
	}

}

at Main.main(Main.java:24)
Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: city : city
at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:49)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:26)

o q estou fazendo de errado?

le-silva

Na tag endereco tem uma tag city:

<endereco><city>teste</city></endereco>

Você precisa acrescentar um atributo city na classe Endereco.

R
Você precisa acrescentar um atributo city na classe Endereco.

já está lá.. :)

na classe pessoa está assim

[code]
public class Pessoa {

private List address = new ArrayLis();
//getters e setters

}

le-silva

Então, cara, precisa haver um atributo city na classe Endereco:

class Endereco {
...
    private String city;
...
}

Porque o nó vai mapear a classe Endereco; e o nó , que é filho de , vai mapear o atributo city da classe Endereco.

R

vc não entendeu … :smiley:

minha classe Endereco já tem o atributo:

public class Endereco {
  private String city;
//get e set

}

valeu!

le-silva

Dificil entender com o exemplo que vc deu, né?

Mas beleza…

R

foi mal…

mas e ai,alguma luz?

valeu

le-silva

Taí…

public class Pessoa {

    private List<Endereco> endereco;   
}
public class Endereco {
	
    private String nome;   
    private String rua;
    private String city;
}
public class Teste {
	
    public static void main(String[] args) {   
        String xml   = "<?xml version='1.0' encoding='ISO-8859-1' standalone='yes'?>"+   
        "<pessoa>"+   
        "<endereco><nome>nome1</nome><rua>rua1</rua><city>city1</city></endereco>"+   
        "<endereco><nome>nome2</nome><rua>rua2</rua><city>city2</city></endereco>"+   
        "</pessoa>";
        
        try {   
	       XStream x = new XStream(new DomDriver());   
	        x.alias("pessoa", Pessoa.class);   
	        x.alias("endereco", Endereco.class);   
	           
	        x.addImplicitCollection(Pessoa.class, "endereco", Endereco.class);
	        
	        Pessoa p = (Pessoa)x.fromXML(xml);   
	        System.out.println(p);   
        } catch(Exception e) {   
            e.printStackTrace();   
        }   
    }
}
R

show de bola…

muito obrigado! :lol:

abraço

R

pessoal,
e num caso como abaixo:

"<email>[email removido]</email>"+
	"<email>[email removido]</email>"+

nesse caso,se eu usar implicitCollection o que será retornado é algo do tipo:
Email@e753

e se eu tentar pegar o atributo normalmente dá “erro duplicated”.

como fazer?

R

alguem?

Criado 20 de dezembro de 2007
Ultima resposta 20 de dez. de 2007
Respostas 16
Participantes 3