Foros del Web » Programación para mayores de 30 ;) » Java »

opciones para pasar de xml a un objeto java

Estas en el tema de opciones para pasar de xml a un objeto java en el foro de Java en Foros del Web. He implementado un servicio web que devuelve algo como la sieguiente estructura: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código XML: Ver original <clase > <persona > <nombre > Ana ...
  #1 (permalink)  
Antiguo 04/11/2011, 11:21
 
Fecha de Ingreso: febrero-2006
Mensajes: 297
Antigüedad: 18 años, 8 meses
Puntos: 1
opciones para pasar de xml a un objeto java

He implementado un servicio web que devuelve algo como la sieguiente estructura:
Código XML:
Ver original
  1. <clase>
  2. <persona>
  3. <nombre>Ana</nombre>
  4. <apellidos>Fernandez</apellidos>
  5. </persona>
  6. <persona>
  7. <nombre>pablo</nombre>
  8. <apellidos>diaz</apellidos>
  9. </persona>
  10. ...
  11. </persona>
esto ya está hecho y funciona, el problema está en el cliente... he implementado otra aplicación y me recoge bien los resultados pero me los muestra de la siguiente manera
result=> ana fernandez pablo diaz ...

Lo que quiero es convertilos a objetos para poder hacer un listado pero no sé qué herramienta utilizar. Cual me aconsejais? había pensado en xstring, que es lo que he utilizado en el servicio pero creo que al ser un listado de objetos no funciona... Hay alguna librería que me permita hacer esto?
Gracias.
  #2 (permalink)  
Antiguo 04/11/2011, 14:09
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: opciones para pasar de xml a un objeto java

Cuando utilizas xml en un cliente webservice, recibes el xml como una cadena (etiquetas incluidas) y se lo pasas a un parser (en este caso Xstream) que te lo convierte a objetos.

Sobre si puedes hacer listas, sí puedes

http://xstream.codehaus.org/graphs.html
http://xstream.codehaus.org/converters.html

Xstream es de los más sencillos, pero hay más Xmlbeans, JAXB, JDOM, SAX.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 04/11/2011, 19:30
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 16 años, 4 meses
Puntos: 416
Respuesta: opciones para pasar de xml a un objeto java

Te dejo un tutorial sobre JAXB:
http://www.vogella.de/articles/JAXB/article.html
  #4 (permalink)  
Antiguo 05/11/2011, 08:49
 
Fecha de Ingreso: febrero-2006
Mensajes: 297
Antigüedad: 18 años, 8 meses
Puntos: 1
Respuesta: opciones para pasar de xml a un objeto java

Pues si puede hacerse con xstream, prefiero porque es una de las opciones que tenemos...
la opción toXML ya está hecha y al testar el ws crea perfectamente el xml con sus etiquetas, el problema lo tengo al hacer el fromxml... Al ser un listado con varias personas, no sé cómo recorrerlas luego en el cliente, no he visto ningún ejemplo parecido.

Y también tengo dudas sobre si tengo que tener la clase Persona.class creada en el cliente y en qué directorio tiene que estar. Me imagino que tendré que tener esa clase porque ahora me sale subrayado en rojo como si estuviera mal, pero no sé donde guardarla...

Mi trozo de código para llamar al ws es el siguiente, no sé si estará bien!

Código java:
Ver original
  1. <%
  2.     try {
  3.     ws.WsService service = new ws.WsService();
  4.     ws.Ws port = service.getWsPort();
  5.      // TODO initialize WS operation arguments here
  6.     int num = 21;
  7.     // TODO process result here
  8.     java.lang.String result = port.mostrarPersona(num);
  9.     XStream xstream = new XStream();
  10.         xstream.alias("Persona", Persona.class); //esto no sé si hace falta aqui
  11.     Persona p=(Persona) xstream.fromXML(result);
  12.         System.out.println(p.cadena());//cadena es una funcion de persona para mostrar ciertas características
  13.     } catch (Exception ex) {
  14.     // TODO handle custom exceptions here
  15.     }
  16.     %>
  #5 (permalink)  
Antiguo 05/11/2011, 11:44
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: opciones para pasar de xml a un objeto java

-La conversión entre etiqueta y clases/atributos es directa si coincide exactamente con el nombre, incluyendo mayúsculas
-Si no coinciden se usa alias para indicar la relación
-A las listas hay que darle una etiqueta e indicar con alias la clase de las etiquetas que contiene.

Con esto debería servirte para saber qué tienes que poner, seguro que con los converter puedes hacer mejor las cosas, pero yo nunca he usado esta librería.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #6 (permalink)  
Antiguo 07/11/2011, 05:04
 
Fecha de Ingreso: febrero-2006
Mensajes: 297
Antigüedad: 18 años, 8 meses
Puntos: 1
Respuesta: opciones para pasar de xml a un objeto java

He conseguido pasar por el servicio web una sola persona, lo que me pasaba era que me faltaba era lo siguiente:
new XStream() => new XStream(new DomDriver()) --> para que pueda analizar el documento.

Ahora el problema le tengo en el listado de personas y creo que es porque al hacer toxml, me crea el siguiente xml:
Código XML:
Ver original
  1. <Personas>
  2. <Personas>
  3. <Persona>
  4. <nombre>Maria</nombre>
  5. <apellidos>gil</apellidos>
  6. </Persona>
  7. <Persona>...
es decir, me crea 2 veces la etiqueta personas...

NO sé porqué puede ser, supongo que por eso no puedo recorrerlo en el cliente. Podéis decirme si veis algo que esté mal? Las clases que tengo son las siguientes:

Personas:
Código java:
Ver original
  1. public class Personas{
  2.     private List<Persona> Personas;
  3.  
  4.     public Personas(){
  5.         Personas= new ArrayList<Persona>();
  6.     }
  7.     public void add(Persona p) {
  8.         Personas.add(p);
  9.     }
  10.  
  11. }

Y el servicio que es donde creo el array y lo paso al xml es:

Código java:
Ver original
  1. String xml="";
  2.        
  3.         Personas lista= new Personas();
  4.         Persona p=null;
  5.         try{
  6.         ResultSet rs = st.executeQuery("select * from personas WHERE 1");
  7.         XStream xstream = new XStream();
  8.         xstream.alias("Personas ", Personas .class);
  9.         xstream.alias("Persona ", Personas.class);
  10.             while ( rs.next() )
  11.             {
  12.                 p= new Persona();
  13.                 p.setNombre(rs.getInt(2));
  14.                 p.setApellidos(rs.getInt(3));
  15.                 lista.add(p) ;
  16.             }
  17.            xml =xstream.toXML(lista);
  18.            return xml;

POr qué puede ser que me duplique la etiqueta? si solamente creo la lista una vez?
  #7 (permalink)  
Antiguo 07/11/2011, 06:38
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: opciones para pasar de xml a un objeto java

Cita:
La conversión entre etiqueta y clases/atributos es directa si coincide exactamente con el nombre, incluyendo mayúsculas
Tienes una clase Personas, y dentro un Lsit personas, por lo tanto te crea una etiqueta por la clase y otra por el list.

¿Y esto?
Cita:
xstream.alias("Personas ", Personas .class);
xstream.alias("Persona ", Personas.class);
Estás asignádole a dos etiquetas la misma clase, eso no tiene sentido.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #8 (permalink)  
Antiguo 07/11/2011, 07:08
 
Fecha de Ingreso: febrero-2006
Mensajes: 297
Antigüedad: 18 años, 8 meses
Puntos: 1
Respuesta: opciones para pasar de xml a un objeto java

Perdón esto está mal, fue al copiarlo:
xstream.alias("Personas ", Personas .class);
xstream.alias("Persona ", Persona.class);

esto ya lo había leido:
a conversión entre etiqueta y clases/atributos es directa si coincide exactamente con el nombre, incluyendo mayúscula
Pero si no pongo alias, me pone lo siguiente <ws.Persona>

Y como que tengo una clase Personas dentro de persona? no lo entiendo...

Yo creo que dentro de listaPersonas están las personas, no al revés.

Las clases que he mostrado eran Personas.java (la lista de personas) y ws.java (servicio web). No he puesto Persona.java, perdón:

Código java:
Ver original
  1. public class Persona{
  2. public String nombre;
  3.     public String apellidos;
  4.  
  5.     public Persona(){
  6.        super();
  7.     }
  8.  
  9.      public String getNombre() {
  10.         return nombre;
  11.     }
  12.  
  13.     public void setNombre(String nombre) {
  14.         this.nombre= nombre;
  15.     }
  16.  
  17.     public String getApellidos() {
  18.         return apellidos;
  19.     }
  20.  
  21.     public void setApellidos(String apellidos) {
  22.         this.apellidos= apellidos;
  23.     }
  24.    
  25. }
  #9 (permalink)  
Antiguo 07/11/2011, 07:54
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: opciones para pasar de xml a un objeto java

Al poner

Cita:
xstream.alias("Personas ", Personas .class);
le estás diciendo que a cada objeto de la clase Personas, le corresponde una etiqueta <Personas></Personas>. Eso es correcto, ya que de lo contrario te crea una etiqueta con la ruta completa de la clase.

Dentro de la clase Personas tienes una lista como atributo llamada también personas, por lo que automáticamente se te crea otra etiqueta llamada personas. Si la lista se llamara listaPersonas, la etiqueta sería listaPersonas.

Cita:
<Personas>
<listaPersonas>
<Persona>
...
</Persona>
<Persona>
...
</listaPersonas>
</Personas>
Ten en cuenta que por cada clase tienes una etiqueta, y los atributos también son clases.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #10 (permalink)  
Antiguo 07/11/2011, 10:15
 
Fecha de Ingreso: febrero-2006
Mensajes: 297
Antigüedad: 18 años, 8 meses
Puntos: 1
Respuesta: opciones para pasar de xml a un objeto java

Ah, vale ya lo entendí... Llevo poco tiempo con java y estos detalles me cuesta mucho pillarlos muchas gracias. He puesto el array en la clase Persona y he eliminado la clase Habitaciones... ahora me lo pasa bien, muchas gracias!!

Etiquetas: objeto, opciones, string, xml
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:04.