2011-03-27 15 views
8

Sto usando xStream per manipolare XML. Tutto va bene. Mettere su archivio XML e altre cose. Ma, ho un problema:Problemi xStream - Come deserializzare più oggetti

Esempio: il mio xml contiene un tag, e all'interno di questo, ho alcuni più tag denominati <comment>. Guarda un codice di esempio:

<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> 

E progressivamente. Posso fare 500 tag all'interno del tag. E questi commenti sono di tipo commento.

Come posso eseguire la serializzazione con xStream per inserire tutti questi tag nelle classi? Non so come fare in classe a ricevere i vari oggetti.

Ovviamente, lo farò con una matrice o un'altra. Ma non so come posso farlo.

+2

Il tuo aspetto XML un po 'fuori. Il tag '' deve terminare con il tag '' e non '' '. Inoltre, questo è quello che stai cercando: http://stackoverflow.com/questions/3136234/xstream-root-as-a-collection-of-objects? – Nishan

+0

[Questa domanda] (http://stackoverflow.com/questions/3824362/xstream-alias-of-list-root-elements) è simile. –

risposta

12

Per questo XML, si sarebbe probabilmente cercando di avere una struttura di classe come:

public class Comment { 
    long id 
    String desc 
} 

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

La logica unmarshalling sarebbe allora qualcosa di simile:

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); 

Additionaly, come menzionato in Nishan i commenti, il tuo XML non è abbastanza formato correttamente. Dovrai assicurarti che il tuo <comment> termini con </comment> e non con </comments>. Dovrai risolvere questo problema prima che tutto il codice in questa risposta funzioni.

+0

Ooh, si. Grazie. In questo xml che pubblico qui, lo faccio manualmente. L'xml è corretto. Tutti i tag stanno chiudendo i tag corretti. Grazie per la risposta. –

+0

@Rob Hruska so che è un po 'in ritardo, ma come posso specificare il percorso del file XML? – Twhite1195

+0

@ Twhite1195 L'XML dovrebbe essere letto da un FileInputStream o qualcosa del genere. –

1

Se si ha a che fare con più oggetti, è probabile che ci si aspetti di chiamare fromXML (InputStream in) più volte per ottenere ciascun oggetto. Tuttavia, il metodo non gestisce come previsto e genera un messaggio di eccezione con una formulazione scadente se lo si fa. In alternativa, avvolgere tutti gli oggetti in un oggetto più grande può far sì che il programma utilizzi più memoria, quindi desideri o esaurisca la memoria.

Per risolvere questo problema, ho creato un metodo di utilità generico in modo da poter analizzare ogni piccolo oggetto nella propria stringa in modo da poterlo utilizzare con il metodo fromXML(String) e ridimensionarlo ancora.

Esempio chiama:

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

Anche se è un vecchio thread, ma qui è la versione annotata:

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

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

Per Unmarshal avete bisogno di questo:

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