2017-01-20 42 views
0

Я пытаюсь преобразовать объекты карты (HashMap, LinkedHashMap и ConcurrentHashMap) в xml String с помощью XStream() API. Хотя преобразование HashMap Я могу превратить мою карту в XML с моим желаемым корневым элементом, установив псевдоним, как convertApi.alias("desired-root",Map.class);Не удается переопределить корневой элемент при преобразовании объекта LinkedHashMap и ConcurrentHashMap в xml с помощью XStream()

Принимая во внимание, в то время как преобразование LinkedHashMap или ConcurrentHashMap я не получаю желаемый-корень для моего XML, получая переопределенные как «связанная-хэш-карта» или «параллельная-хэш-карта» соответственно

Просьба помочь мне получить желаемый корень при использовании связанногоhashmap или ConcurrentHashMap. Заранее спасибо :)

Код:

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

}

Выход:

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> 

ответ

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

Попробуйте это.

+1

Можете ли вы добавить описание/дополнительную информацию, чтобы улучшить качество ответа? – goto

+0

Спасибо Гокул! Это помогло мне много :) (y) – Karthikeyan

+0

Но у меня есть еще одна проблема, если есть ключ с подчеркиванием типа «197_189», я получаю двойные подчеркивания, добавляя его как элемент ниже <197__189> Можете ли вы, пожалуйста, помочь мне с этим также – Karthikeyan