2011-03-27 20 views
8

私はxStreamを使ってXMLを操作しています。すべては大丈夫です。 XMLアーカイブなどを載せる。しかし、私は問題があります:xStreamの問題 - 複数のオブジェクトを逆シリアル化する方法

例:My 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を使用してシリアル化する方法を教えてください。私はクラスにどのようにして様々なオブジェクトを受け取るかをしません。

明らかに、私はこれを配列などで作成します。 しかし、私はこれをどうやってできるのか分かりません。ニシャンがで述べたように、Additionaly

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

:あなたの非整列化ロジックは、次にようなものになるだろう

public class Comment { 
    long id 
    String desc 
} 

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

:そのXML用

+2

あなたのxmlルックス:あなたはこれを必要

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

が非整列化少し離れている。 ''タグは''タグで終わり、 ''タグで終わらないはずです。また、これはあなたが探しているものです:http://stackoverflow.com/questions/3136234/xstream-root-as-a-collection-of-objects? – Nishan

+0

[この質問](http://stackoverflow.com/questions/3824362/xstream-alias-of-list-root-elements)も同様です。 –

答えて

12

、あなたはおそらくのようなクラス構造を持つように見ていることだろうコメント、あなたのXMLは正しく形成されていません。 <comment></comment>で終わり、</comments>でないことを確認する必要があります。この答えのコードのいずれかが動作する前にこれを修正する必要があります。

+0

ああ、そうです。ありがとうございました。私がここに投稿するこのXMLでは、私はそれを手作業で簡単に行います。 XMLが正しいです。すべてのタグが正しいタグを閉じています。ご回答ありがとうございます。 –

+0

@Rob Hruska私が知っているのは少し遅れますが、どうすればXMLファイルの場所を指定できますか? – Twhite1195

+0

@ Twhite1195 XMLはFileInputStreamなどから読み込む必要があります。 –

1

複数のオブジェクトを扱う場合は、fromXMLInputStream)を複数回呼び出すと、各オブジェクトを取得することが予想される可能性があります。このメソッドは、期待通りに処理しませんし、これを行うと、予期しない例外メッセージがスローされます。あるいは、より大きなオブジェクトにすべてのオブジェクトをラップすると、プログラムがより多くのメモリを使用してメモリを使い果たす可能性があります。

これを修正するために、汎用のユーティリティメソッドを作成しました。それぞれの小さなオブジェクトを独自の文字列に解析して、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; 
    } 
7

それは古いスレッドですが、ここでは注釈付きバージョンですが:

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