xStream问题 - 如何反序列化多个对象

时间:2011-03-27 15:45:13

标签: java xml xml-parsing xstream

我正在使用xStream来操作XML。一切都好。要放置XML存档和其他东西。但是,我有一个问题:

示例:我的xml包含一个标记,在这个标记内部,我还有一些名为<comment>的标记。查看示例代码:

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

渐进地。 我可以在标签内做500个标签。这些评论属于评论类型。

如何使用xStream序列化以将所有这些标记放入类中?我不怎么在课堂上让它收到各种各样的物品。

显然,我会用数组或其他方法制作它。 但我不知道如何做到这一点。

3 个答案:

答案 0 :(得分:12)

对于那个XML,你可能希望有一个类结构:

public class Comment {
    long id
    String desc
}

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

你的解组逻辑就像是:

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

另外,正如Nishan在评论中提到的那样,你的XML形成不正确。您需要确保<comment></comment>而不是</comments>结束。在此答案中的任何代码都有效之前,您需要先解决此问题。

答案 1 :(得分:7)

虽然它是一个旧线程,但这里是Annotated版本:

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

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

要解散你需要这个:

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

答案 2 :(得分:1)

如果您处理多个对象,您可能希望多次调用fromXMLInputStream in)来获取每个对象。该方法虽然没有按预期处理,但如果你这样做,它会抛出一个措辞不好的异常消息。或者,将所有对象包装在较大的对象中可能会导致程序使用所需的更多内存或耗尽内存。

为了解决这个问题,我制作了一个通用的实用工具方法,这样我就可以将每个小对象解析为自己的字符串,这样我就可以fromXML(String)方法并且仍然可以扩展。

示例电话:

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