使用XStream </string,>将XML转换为Java Map <string,integer =“”>

时间:2014-08-02 17:10:00

标签: java xml map xstream

我将XML代码转换为Java Map。 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;
   }
}

我在上面的函数中遇到错误&#34; map.put(reader.getNodeName(),reader.getValue());&#34;。错误说:&#34;类型Map中的put(String,Integer)方法不适用于参数(String,String)。&#34;

所以我在这里有两个问题。首先,为什么会发生这种错误,我该如何解决?其次,我还需要实现什么来最终让XStream将其转换为XML?

非常感谢任何帮助。提前谢谢!

2 个答案:

答案 0 :(得分:1)

是错误是正确的reader.getValue()正在给出字符串,您必须在整数中键入Cast it

更改以下代码

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

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

答案 1 :(得分:0)

这是我的使用嵌套地图处理更复杂数据的示例

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

玩得开心!