将XML转换为Java映射<;字符串,整数>;使用XStream
我正在将XML代码转换为Java映射。XML将大量随机单词与一个数字(概率分布)相匹配,如下所示:将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 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;
}
}