2011-03-27 36 views
8

Estoy usando xStream para manipular XML. Todo esta bien. Para poner en archivo XML y otras cosas. Pero, tengo un problema:xStream problems - Cómo deserializar múltiples objetos

Ejemplo: Mi xml contiene una etiqueta, y dentro de esta, tengo algunas más etiquetas llamadas <comment>. Mire un código de ejemplo:

<comments> 
    <comment> 
     <id>1</id> 
     <desc>A comment</desc> 
    </comment> 
    <comment> 
     <id>2</id> 
     <desc>Another comment</desc> 
    </comment> 
    <comment> 
     <id>3</id> 
     <desc>Another one comment</desc> 
    </comment> 
</comments> 

Y progressivelly. Puedo hacer 500 etiquetas dentro de la etiqueta. Y estos comentarios son de tipo comentario.

¿Cómo puedo hacer una serialización con xStream para poner todas estas etiquetas en las clases? No sé cómo hacer en la clase para recibir los diversos objetos.

Obviamente, voy a hacer esto con una matriz, o alguna otra. Pero no sé cómo puedo hacer esto.

+2

Sus miradas xml un poco malogrado. La etiqueta '' debe terminar con la etiqueta '', y no la etiqueta ''. Además, ¿es esto lo que está buscando: http://stackoverflow.com/questions/3136234/xstream-root-as-a-collection-of-objects? – Nishan

+0

[Esta pregunta] (http://stackoverflow.com/questions/3824362/xstream-alias-of-list-root-elements) también es similar. –

Respuesta

12

Por esa XML, que probablemente estaría buscando tener una estructura de clases como:

public class Comment { 
    long id 
    String desc 
} 

public class Comments { 
    List<Comment> comments = new ArrayList<Comment>(); 
} 

Su lógica unmarshalling entonces sería algo así como:

XStream xstream = new XStream(); 
xstream.alias("comments", Comments.class); 
xstream.alias("comment", Comment.class); 
xstream.addImplicitCollection(Comments.class, "comments"); 
Comments comments = (Comments)xstream.fromXML(xml); 

Adicionalmente, como se menciona en Nishan los comentarios, su XML no está formado correctamente. Deberá asegurarse de que su <comment> finalice con </comment> y no </comments>. Deberá corregir esto antes de que funcione cualquier código en esta respuesta.

+0

Ooh, sí. Gracias. En este xml que publico aquí, lo hago de forma simple. El xml es correcto. Todas las etiquetas están cerrando las etiquetas correctas. Gracias por responder. –

+0

@Rob Hruska Sé que es un poco tarde, pero ¿cómo especifico la ubicación del archivo XML? – Twhite1195

+0

@ Twhite1195 El XML debe leerse desde un FileInputStream o algo así. –

1

Si trabaja con varios objetos, es posible que espere llamar al fromXML (InputStream in) varias veces para obtener cada objeto. Sin embargo, el método no funciona como se esperaba y arroja un mensaje de excepción mal redactado si lo hace. Alternativamente, envolver todos los objetos en un objeto más grande puede hacer que el programa use más memoria que la deseada o se quede sin memoria.

Para arreglar esto, hice un método de utilidad genérico para poder analizar cada objeto pequeño en su propia cadena, así que pude fromXML(String) método y aún ampliar el tamaño.

Ejemplo llama:

String element = next(in, "</MyObject>"); 
MyObject o = (MyObject)xstream.fromXML(element); 

public static String next(InputStream in, String occurence) throws IOException { 
     StringBuffer sb = new StringBuffer(); 
     int i; 
     int pos = 0; 
     while((i = in.read()) != -1) { 
      sb.append((char)i); 
      if(i == occurence.charAt(pos)) { 
       pos ++; 
      } else 
       pos = 0; 

      if(pos == occurence.length()) 
       return sb.toString(); 
     } 
     return null; 
    } 
7

Aunque es un viejo hilo, pero aquí es la versión anotada:

@XStreamAlias("comment") 
public class Comment { 
    long id 
    String desc 
} 

@XStreamAlias("comments") 
public class Comments { 
    @XStreamImplicit(itemFieldName = "comment") 
    List<Comment> comments; 
} 

Para unmarshal necesita esto:

XStream xStream = new XStream(); 
xStream.processAnnotations(new Class[] { Comments.class, Comment.class }); 
Comments comments = (Comments)xStream.fromXML(xml);