【问题标题】:Converting XML to Java Map<String, Integer> using XStream使用 XStream 将 XML 转换为 Java Map<String, Integer>
【发布时间】:2014-09-25 16:13:32
【问题描述】:

我正在将 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;
   }
}

我在上面的函数中遇到了一个错误,在“map.put(reader.getNodeName(), reader.getValue());”这一行。错误说:“方法 put(String, Integer)类型 Map 中的参数不适用于参数 (String, String)。”

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

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

【问题讨论】:

    标签: java xml map xstream


    【解决方案1】:

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

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

    玩得开心!

    【讨论】:

      【解决方案2】:

      是的,错误是正确的 reader.getValue() 给出 String ,您必须将其类型转换为 Integer

      更改以下代码

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

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

      【讨论】:

      • 好的。我这样做了,它摆脱了错误并正确编译。但是,我收到了一个新异常,上面写着“线程“主”com.thoughtworks.xstream.mapper.CannotResolveClassException:root 中的异常”。对此有何建议?
      • 只需检查下面的线程stackoverflow.com/questions/21283052/…
      猜你喜欢
      • 2014-09-24
      • 2019-12-06
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 2021-10-19
      相关资源
      最近更新 更多