2011-03-27 63 views
8

我正在使用xStream處理XML。一切都好。把XML檔案和其他東西。但是,我有一個問題:xStream問題 - 如何反序列化多個對象

例如:我的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> 

and progressivelly。 我可以在標籤內做500個標籤。這些評論是類型評論。

我該怎麼做才能使用xStream將所有這些標籤放入類中?我不會在課堂上讓它接受各種物體。

很明顯,我會用一個數組或其他。 但我不知道如何做到這一點。

+2

你的XML看起來一點點。 ''標籤應該以''標籤結尾,而不是''標籤。此外,這是你在找什麼:http://stackoverflow.com/questions/3136234/xstream-root-as-a-collection-of-objects? – Nishan 2011-03-27 16:06:56

+0

[此問題](http://stackoverflow.com/questions/3824362/xstream-alias-of-list-root-elements)也類似。 – 2011-03-27 17:19:16

回答

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

Additionaly,如尼山提到的評論,你的XML沒有完全正確地形成。您需要確保<comment></comment>結尾,而不是</comments>。您需要在此答案中的任何代碼生效之前解決此問題。

+0

哦,是的。謝謝。在這個我在這裏發佈的XML我簡單地手動。該XML是正確的。所有標籤都關閉了正確的標籤。謝謝你的回答。 – 2011-03-28 22:25:04

+0

@Rob Hruska我知道有點晚了,但我該如何指定XML文件的位置? – Twhite1195 2016-11-17 03:54:58

+0

@ Twhite1195 XML應該從FileInputStream或其他東西中讀取。 – 2016-12-28 11:50:10

1

如果您處理多個對象,您可能希望多次呼叫fromXMLInputStream)以獲取每個對象。該方法並沒有像預期的那樣處理,並且如果你這樣做,會引發措辭不佳的異常消息。或者,將所有對象包裝在較大的對象中可能會導致程序使用更多內存,然後使用或耗盡內存。

爲了解決這個問題,我做了一個通用的實用工具方法,這樣我就可以將每個小對象解析爲它自己的字符串,這樣我就可以方法並且仍然可以放大尺寸。

調用示例:

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

雖然這是一個古老的線程,但這裏是註釋版本:

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