[RESOLVIDO] Ler XML XStream & ArrayList

6 respostas
cajurucs

Bom dia Galera!

To com um problema aqui com a forma que eu estou lendo um arquivo de XML.

Segue o XML:

<?xml version="1.0" encoding="iso-8859-1" ?>
<sroxml>
   <versao>1.0</versao>
   <qtd>3</qtd>
   <TipoPesquisa>Lista de Objetos</TipoPesquisa>
   <TipoResultado>Último evento</TipoResultado>
     <objeto>
       <numero>PH082984683BR</numero>
       <evento>
          <tipo>BDE</tipo>
          <status>01</status>
          <data>24/09/2012</data>
          <hora>16:48</hora>
          <descricao>Entregue</descricao>
          <recebedor>                                                                        </recebedor>
          <documento>                         </documento>
          <comentario>                         </comentario>
          <local>CDD MARACANAU</local>
          <codigo>61900971</codigo>
          <cidade>MARACANAU</cidade>
          <uf>CE</uf>
          <sto>12414000</sto>
      </evento>
     </objeto>
</sroxml>
Segue o código em Java:
import java.io.*;
import com.thoughtworks.xstream.XStream;  
  
public class TesteXStream {  
    public static void main(String[] args) throws FileNotFoundException {  
        // Criando um objeto XStream          
        XStream xstream = new XStream();    
  
        // Passando os dados de XML para Objetos Java 
                  
        sroxml minhaBusca = (sroxml)xstream.fromXML(new FileInputStream(new File("C:/Users/Regina/Desktop/teste.xml"))); 
       
        System.out.println(minhaBusca.getNumero());
        System.out.println(minhaBusca.getDescricao());
                      
    }  
}

Segue a classe sroxml:

public class sroxml {
	
	private String versao;
	private String qtd;
	private String TipoPesquisa;
	private String TipoResultado;
	
	objeto objeto = new objeto();
	
	public String getNumero() {
		// TODO Auto-generated method stub
		return objeto.getNumero();
	}

	// getters e setters ...
}
Segue a classe de objeto:
public class objeto {
	
	private String numero;
	
	evento evento = new evento();
	
	public String getNumero() {
		// TODO Auto-generated method stub
		return numero;
	}	
        // getters e setters ...
}

O problema é quando eu quero puxar do meu XML e ele tem apenas 1 objeto, ele lê tranquilo.
Mas quando eu tenho mais de 1 objeto, ele da o seguinte erro:

Exception in thread "main" com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$DuplicateFieldException: Duplicate field objeto
---- Debugging information ----
field               : objeto
class               : sroxml
required-type       : sroxml
converter-type      : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
path                : /sroxml/objeto[2]
line number         : 42
version             : null
-------------------------------
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$3.add(AbstractReflectionConverter.java:242)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:332)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:234)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
	at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134)
	at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1058)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1042)
	at com.thoughtworks.xstream.XStream.fromXML(XStream.java:922)
	at TesteXStream.main(TesteXStream.java:13)

Desde já Agradeço!

6 Respostas

B
public class SROXML {

	private String versao;
	private String qtd;
	private String tipoPesquisa;
	private String tipoResultado;
	private Objeto objeto;

	public String getVersao() {
		return versao;
	}

	public String getQtd() {
		return qtd;
	}

	public String getTipoPesquisa() {
		return tipoPesquisa;
	}

	public String getTipoResultado() {
		return tipoResultado;
	}

	public Objeto getObjeto() {
		return objeto;
	}
}
public class Objeto {

	private String numero;
	private Evento evento;

	public String getNumero() {
		return numero;
	}

	public Evento getEvento() {
		return evento;
	}
}
public class Evento {

	private String tipo;
	private String status;
	private String data;
	private String hora;
	private String descricao;
	private String recebedor;
	private String documento;
	private String comentario;
	private String local;
	private String codigo;
	private String cidade;
	private String uf;
	private String sto;

	public String getTipo() {
		return tipo;
	}

	public String getStatus() {
		return status;
	}

	public String getData() {
		return data;
	}

	public String getHora() {
		return hora;
	}

	public String getDescricao() {
		return descricao;
	}

	public String getRecebedor() {
		return recebedor;
	}

	public String getDocumento() {
		return documento;
	}

	public String getComentario() {
		return comentario;
	}

	public String getLocal() {
		return local;
	}

	public String getCodigo() {
		return codigo;
	}

	public String getCidade() {
		return cidade;
	}

	public String getUf() {
		return uf;
	}

	public String getSto() {
		return sto;
	}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import com.thoughtworks.xstream.XStream;

public class TesteXStream {

	public static void main(String[] args) throws FileNotFoundException {

		XStream xstream = new XStream();
		xstream.alias("sroxml", SROXML.class);

		String filename = "test/main/resources/teste.xml";
		File file = new File(filename);

		SROXML minhaBusca = (SROXML) xstream.fromXML(new FileInputStream(file));

		Objeto objeto = minhaBusca.getObjeto();
		System.out.println(objeto.getNumero());

		Evento evento = objeto.getEvento();
		System.out.println(evento.getDescricao());
	}
}
B

BTW, você falou de uma lista, não vi nenhuma. Qual o XML que tem vários elementos repetidos?

cajurucs

Bruno, esse xml, quando eu pesquiso mais de 1 objeto por vez, ele me retorna desta maneira, no caso estou pesquisando 3 objeto, num máximo de 50 por pesquisa.

<?xml version="1.0" encoding="iso-8859-1" ?>
<sroxml>
   <versao>1.0</versao>
   <qtd>3</qtd>
   <TipoPesquisa>Lista de Objetos</TipoPesquisa>
   <TipoResultado>Último evento</TipoResultado>
     <objeto>
       <numero>PH082984683BR</numero>
       <evento>
          <tipo>BDE</tipo>
          <status>01</status>
          <data>24/09/2012</data>
          <hora>16:48</hora>
          <descricao>Entregue</descricao>
          <recebedor>                                                                        </recebedor>
          <documento>                         </documento>
          <comentario>                         </comentario>
          <local>CDD MARACANAU</local>
          <codigo>61900971</codigo>
          <cidade>MARACANAU</cidade>
          <uf>CE</uf>
          <sto>12414000</sto>
      </evento>
     </objeto>
     <objeto>
       <numero>PH082984697BR</numero>
       <evento>
          <tipo>BDE</tipo>
          <status>01</status>
          <data>23/09/2012</data>
          <hora>15:39</hora>
          <descricao>Entregue</descricao>
          <recebedor>                                                                        </recebedor>
          <documento>                         </documento>
          <comentario>                         </comentario>
          <local>CDD CIDADE DE AGUEDA</local>
          <codigo>96202970</codigo>
          <cidade>RIO GRANDE</cidade>
          <uf>RS</uf>
          <sto>00061702</sto>
      </evento>
     </objeto>
     <objeto>
       <numero>PH082984706BR</numero>
       <evento>
          <tipo>BDE</tipo>
          <status>01</status>
          <data>24/09/2012</data>
          <hora>17:13</hora>
          <descricao>Entregue</descricao>
          <recebedor>                                                                        </recebedor>
          <documento>                         </documento>
          <comentario>                         </comentario>
          <local>AC IPIAU</local>
          <codigo>45570970</codigo>
          <cidade>IPIAU</cidade>
          <uf>BA</uf>
          <sto>08303355</sto>
      </evento>
     </objeto>
</sroxml>
cajurucs

Bruno, eu vi aqui que tu fez o código praticamente todo aqui, KKK
Vlw!! Ontem eu fiquei aqui montando e eu consegui exibir, fiz de uma forma diferente, mas funcionou da mesma maneira.
O problema agora vai ser eu criar uma ArrayList, pra esses objetos que tem mais de um.

B

Listas de objetos em xml é mais complicado, não tem uma relação 1 pra 1 com código Java. Apelando para anotações:

@XStreamAlias("sroxml")
public class SROXML {

	private String versao;
	private String qtd;
	private String tipoPesquisa;
	private String tipoResultado;
	
	@XStreamImplicit(itemFieldName="objeto")
	private List<Objeto> listObjetos;
public static void main(String[] args) throws FileNotFoundException {

		XStream xstream = new XStream();
		xstream.processAnnotations(SROXML.class);

		String filename = "test/main/resources/teste.xml";
		File file = new File(filename);

		SROXML minhaBusca = (SROXML) xstream.fromXML(new FileInputStream(file));

		for (Objeto objeto : minhaBusca.getListObjetos()) {

			System.out.println(objeto.getNumero());

			Evento evento = objeto.getEvento();
			System.out.println(evento.getDescricao());
		}
	}

PS: Uma pergunta, isso é um webservice? Se tiver um WSDL dá pra usar o wsimport para gerar todas essas classes, serializadores, etc.

cajurucs

Funcionou perfeitamente cara!
Muito Obrigado mesmo!

Não, ainda não é um webservice.
Eu tenho que desenvolver esta parte da busca de objetos, aí mais futuramente vai virar um webservice.

Obrigadão pela ajuda!

Criado 25 de setembro de 2012
Ultima resposta 25 de set. de 2012
Respostas 6
Participantes 2