Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将XML转换为Java映射<;字符串,整数>;使用XStream_Java_Xml_Map_Xstream - Fatal编程技术网

将XML转换为Java映射<;字符串,整数>;使用XStream

将XML转换为Java映射<;字符串,整数>;使用XStream,java,xml,map,xstream,Java,Xml,Map,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>

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

1.
2.
2.
3.
2.
1.
.......
我正试图用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"));
XStream XStream=newxstream();
地图英文版;
registerConverter(新的MapEntryConverter());
englishCorpusProbDist=(Map)xstream.fromXML(新文件(“C:/Users/David Naber/Documents/IREP Project/frequencies.xml”);
这是我的MapentryConverter类:

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;
   }
}
公共类MapEntryConverter实现转换器{
公共布尔canConvert(类clazz){
返回Map.class.isAssignableFrom(clazz);
}  
公共无效封送处理(对象值、HierarchycalStreamWriter编写器、封送上下文){
Map=(Map)值;
对于(Map.Entry:Map.entrySet()){
writer.startNode(entry.getKey().toString());
writer.setValue(entry.getValue().toString());
writer.endNode();
}
}
公共对象解组(HierarchycalStreamReader读取器,解组上下文){
Map Map=newhashmap();
while(reader.hasMoreChildren()){
reader.moveDown();
put(reader.getNodeName(),reader.getValue());
reader.moveUp();
}
返回图;
}
}
我在上面的函数的“map.put(reader.getNodeName(),reader.getValue())行中得到一个错误;。错误为:“类型映射中的方法put(字符串,整数)不适用于参数(字符串,字符串)。”

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


非常感谢您的帮助。提前谢谢!

是错误正确
读取器。getValue()
正在提供字符串,您必须在整数中键入Cast

更改以下代码

map.put(reader.getNodeName(), 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;
    }
  }
公共静态类MapEntryConverter实现转换器{
静态最终转换器实例=新的MapEntryConverter();
公共布尔canConvert(类clazz){
返回Map.class.isAssignableFrom(clazz);
}
公共无效封送处理(对象值、HierarchycalStreamWriter编写器、封送上下文){
Map=(Map)值;
对于(对象对象对象:map.entrySet()){
Map.Entry=(Map.Entry)obj;
writer.startNode(entry.getKey().toString());
Object val=entry.getValue();
if(val!=null)context.convertOther(val);
writer.endNode();
}
}
公共对象解组(HierarchycalStreamReader读取器,解组上下文){
Map Map=newlinkedhashmap();
while(reader.hasMoreChildren()){
reader.moveDown();
String key=reader.getNodeName();
对象值=空;
if(reader.hasMoreChildren()){
值=解组(读取器、上下文);
}否则{
value=reader.getValue();
}
map.put(键、值);
reader.moveUp();
}
返回图;
}
}

玩得开心!

好的。我这样做了,它消除了错误并正确编译。但是,我收到了一个新的异常,上面写着“线程中的异常”main“com.thoughtworks.xstream.mapper.CannotResolveClassException:root”。对此有什么建议吗?只需检查下面的线程
  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;
    }
  }