2015-11-03 10 views
5

私はXStreamのを使用して、次のようなフィールドを持つクラスを持っている:リストからフラットなXML構造を生成できるXStreamカスタムコンバータ?

private Map<String, String> data; 

私はこのようなXML出力を生成したい:

<key1>test data</key1> 
<key2>test data</key2> 
<key3>test data</key3> 

だから私はマップキーになりたいです素子。 mapvalueをXML値にして、<data></data>のような要素にXMLをラップすることは望ましくありません。誰かがこれを行うサンプルコード、またはそれに類するものを指し示すことができますか?

UPDATE

これだけのスニペット、ルート要素があります。

UPDATE 2

私は下の投稿カスタムコンバータコードはほとんど動作します。フラットな構造が得られますが、外側の要素を取り除く必要があります。それについてのアイデア?

//this is the result need to remove <data> 
<data> 
    <key1>test data</key1> 
    <key2>test data</key2> 
    <key3>test data</key3> 
</data> 

これは、私はこの作業を取得することができたコード

public class MapToFlatConverter implements Converter{ 
    public MapToFlatConverter() { 
    } 

    @Override 
    public boolean canConvert(Class type) { 
     return Map.class.isAssignableFrom(type); 
    } 

    @Override 
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { 
     Map<String, String> map = (Map<String, String>) source; 
     for (Map.Entry<String, String> entry : map.entrySet()) { 
      writer.startNode(entry.getKey()); 
      writer.setValue(entry.getValue().toString()); 
      writer.endNode(); 
     } 
    } 

    @Override 
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { 
     //not needed at this time 

     return null; 
    } 

}

+1

有効なXMLは、複数のルート要素を持っていなければなりません。 – dummy

+0

これは単なるスニペットです。ルート要素があります。私はリストの要素をフラットにしたいだけです。 –

+0

閉じる投票は何ですか?これはSOが作成された疑問のようです。 –

答えて

0

です。私が最終的にしたことは、次のような投稿です:custom converter in XStream。私はReflectionConverterから拡張する必要がありました:

この次の投稿も役に立ちましたが、このアプローチを試みたときにcontext.convertAnother()メソッドが機能していないように見えました。そこで、私は第1稿の方法に切り替えました。

Xstream Implicit Map As Attributes to Root Element

関連する問題