Преобразование XML в Java Map<String, Integer> с использованием XStream

Я конвертирую код XML в карту Java. XML сопоставляет большое количество случайных слов с числом (распределение вероятностей) и выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
   <Durapipe type="int">1</Durapipe>
   <EXPLAIN type="int">2</EXPLAIN>
   <woods type="int">2</woods>
   <hanging type="int">3</hanging>
   <hastily type="int">2</hastily>
   <localized type="int">1</localized>
   .......
</root>

Я пытаюсь реализовать это с XStream. Вот код Java, который в настоящее время использует моя основная программа:

    XStream xstream = new XStream();
    Map<String, Integer> englishCorpusProbDist; 
    xstream.registerConverter(new MapEntryConverter());
    englishCorpusProbDist = (Map<String, Integer>)xstream.fromXML(new File("C:/Users/David Naber/Documents/IREP Project/frequencies.xml"));

А вот мой MapEntryConverterClass:

public class MapEntryConverter implements Converter {
  public boolean canConvert(Class clazz) {
    return Map.class.isAssignableFrom(clazz);
  }  

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

  public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
    Map<String, Integer> map = new HashMap<String, Integer>();

    while (reader.hasMoreChildren()) {
      reader.moveDown();
      map.put(reader.getNodeName(), reader.getValue());
      reader.moveUp();
     }
    return map;
   }
}

Я получаю сообщение об ошибке в вышеуказанной функции, в строке "map.put(reader.getNodeName(), reader.getValue());". Ошибка говорит: "Метод положить (String, Integer) в типе Карта не применима для аргументов (String, String)."

Так что у меня действительно есть два вопроса здесь. Прежде всего, почему происходит эта ошибка и как я могу ее исправить? Во-вторых, что еще мне нужно реализовать, чтобы, наконец, заставить XStream преобразовать это в XML?

Буду признателен за любую оказанную помощь. Заранее спасибо!

2 ответа

Решение

Да ошибка верна reader.getValue() дает строку, вы должны набрать приведение его в целое число

Изменить код ниже

map.put(reader.getNodeName(), reader.getValue());

в

map.put(reader.getNodeName(), new Integer(reader.getValue()));

Это мой пример для более сложных данных с вложенными картами

  public static class MapEntryConverter implements Converter {
    static final Converter INSTANCE = new MapEntryConverter();

    public boolean canConvert(Class clazz) {
      return Map.class.isAssignableFrom(clazz);
    }

    public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
      Map map = (Map) value;
      for (Object obj : map.entrySet()) {
        Map.Entry entry = (Map.Entry) obj;
        writer.startNode(entry.getKey().toString());
        Object val = entry.getValue();
        if (val != null) context.convertAnother(val);
        writer.endNode();
      }
    }

    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
      Map<String, Object> map = new LinkedHashMap<String, Object>();

      while (reader.hasMoreChildren()) {
        reader.moveDown();

        String key = reader.getNodeName();
        Object value = null;

        if (reader.hasMoreChildren()) {
          value = unmarshal(reader, context);
        } else {
          value = reader.getValue();
        }

        map.put(key, value);
        reader.moveUp();
      }

      return map;
    }
  }

Повеселись!

Другие вопросы по тегам