Преобразование 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;
}
}
Повеселись!