8
votes

Problèmes Xstream - Comment désérialiser plusieurs objets

J'utilise Xtream pour manipuler XML. Tout va bien. Mettre sur des archives XML et d'autres choses. Mais, j'ai un problème:

Exemple: mon XML contient une balise, et à l'intérieur de celui-ci, j'ai quelques balises supplémentaires nommées . Regardez un exemple de code: xxx

et progressivement. Je peux faire 500 tags à l'intérieur de la balise. Et ces commentaires sont de type commentaire.

Comment puis-je faire pour sérialiser avec le Xstream pour mettre toutes ces balises dans les classes? Je ne fais pas comment faire dans la classe pour recevoir les différents objets.

Évidemment, je vais en faire cela avec un tableau ou un autre. Mais je ne sais pas comment je peux faire cela.


2 commentaires

Votre XML a l'air un peu désactivé. tag doit terminer par tag et non tag. Aussi, c'est ce que vous recherchez: Stackoverflow.com/Questtions/3136234/... ?


Cette question est également similaire.


3 Réponses :


12
votes

Pour ce XML, vous souhaitez probablement avoir une structure de classe comme:

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


3 commentaires

Ooh oui. Merci. Dans ce XML que je pose ici, je le rends manuellement. Le XML est correct. Toutes les tags ferment les étiquettes correctes. Merci de répondre.


@Rob Hruska Je sais que c'est un peu tard, mais comment puis-je spécifier l'emplacement du fichier XML?


@ Twhite1195 Le XML doit être lu à partir d'un fichierInputStream ou de quelque chose.



1
votes

Si vous traitez avec plusieurs objets, vous pouvez vous attendre à appeler fromexml code> ( introuvable code> in) plusieurs fois pour obtenir chaque objet. La méthode ne gère pas comme prévu cependant et a lancé un message d'exception mal formulée si vous faites cela. Alternativement, l'enveloppement de tous les objets d'un objet plus important peut entraîner une utilisation plus de mémoire, puis souhaitée ou à court de mémoire.

Pour résoudre ce problème, j'ai fait une méthode d'utilité générique afin que je puisse analyser chaque petit objet dans sa propre chaîne, donc je pouvais frtexml (string) code> méthode et encore échelle de taille. P>

Exemple des appels: P>

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


0 commentaires

7
votes

Bien qu'il s'agisse d'un vieux fil, mais voici la version annotée: xxx pré>

à lamarshal Vous en avez besoin: P>

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


0 commentaires