2017-01-20 2 views
0

J'essaie de convertir des objets de mappe (HashMap, LinkedHashMap et ConcurrentHashMap) en chaîne xml à l'aide de l'API XStream(). Lors de la conversion du HashMap Je suis en mesure de convertir ma carte en XML avec mon élément racine souhaité en définissant l'alias comme convertApi.alias("desired-root",Map.class);Impossible de remplacer l'élément racine lors de la conversion d'un objet LinkedHashMap et ConcurrentHashMap en XML à l'aide de XStream()

Alors que lors de la conversion d'un LinkedHashMap ou un ConcurrentHashMap je ne reçois pas mon xml la racine désirée, obtenir écrasé comme "linked-hash-map" ou "concurrent-hash-map" respectivement

Veuillez m'aider à obtenir la racine désirée tout en utilisant le hashshmap ou ConcurrentHashMap. Merci d'avance :)

code:

import com.thoughtworks.xstream.XStream; 
import com.thoughtworks.xstream.converters.Converter; 
import com.thoughtworks.xstream.converters.MarshallingContext; 
import com.thoughtworks.xstream.converters.UnmarshallingContext; 
import com.thoughtworks.xstream.io.HierarchicalStreamReader; 
import com.thoughtworks.xstream.io.HierarchicalStreamWriter; 

import java.util.AbstractMap; 
import java.util.HashMap; 
import java.util.LinkedHashMap; 
import java.util.Map; 

public class Mapping { 
    public static void main(String[] args) { 

    Map<String,String> mp=new LinkedHashMap<String, String>(); 

    //Map contains: EmpId,Name 
    mp.put("197","Deepak kumar modi"); 
    mp.put("198","Sweep panorama"); 
    mp.put("199","HD Video"); 
    mp.put("200","My Motorola Mobile"); 
    //System.out.println(mp); 

    XStream magicApi = new XStream(); 
    magicApi.alias("root", Map.class); 
    magicApi.registerConverter(new MapEntryConverter()); 

    String xml = magicApi.toXML(mp); 
    System.out.println("Result of newly formed Xml:"); 
    System.out.println(xml); 

} 

private static class MapEntryConverter implements Converter{ 

    public void marshal(Object value, HierarchicalStreamWriter hierarchicalStreamWriter, MarshallingContext marshallingContext) { 
     AbstractMap map = (AbstractMap) value; 
     for (Object obj : map.entrySet()) { 
      Map.Entry entry = (Map.Entry) obj; 
      hierarchicalStreamWriter.startNode(entry.getKey().toString()); 
      hierarchicalStreamWriter.setValue(entry.getValue().toString()); 
      hierarchicalStreamWriter.endNode(); 
     } 
    } 

    public Object unmarshal(HierarchicalStreamReader hierarchicalStreamReader, UnmarshallingContext unmarshallingContext) { 
     Map<String, String> map = new HashMap<String, String>(); 
     while(hierarchicalStreamReader.hasMoreChildren()) { 
      hierarchicalStreamReader.moveDown(); 
      map.put(hierarchicalStreamReader.getNodeName(), hierarchicalStreamReader.getValue()); 
      hierarchicalStreamReader.moveUp(); 
     } 
     return map; 
    } 

    public boolean canConvert(Class aClass) { 
     return AbstractMap.class.isAssignableFrom(aClass); 
    } 
} 

}

Sortie:

Result of newly formed Xml: 
<linked-hash-map> 
    <197>Deepak kumar modi</197> 
    <198>Sweep panorama</198> 
    <199>HD Video</199> 
    <200>My Motorola Mobile</200> 
</linked-hash-map> 

Répondre

0
XStream magicApi = new XStream(); 
magicApi.alias("root", LinkedHashMap.class); 

essayer.

+1

Pouvez-vous ajouter une description/des détails supplémentaires pour améliorer la qualité de votre réponse? – goto

+0

Merci Gokul !! Cela m'a beaucoup aidé :) (y) – Karthikeyan

+0

Mais j'ai un autre problème s'il y a une touche avec un soulignement comme "197_189", je reçois double underscore en l'ajoutant comme un élément comme ci-dessous <197__189> pouvez-vous m'aider s'il vous plaît avec cette aussi – Karthikeyan