将XML转换为Java映射<;字符串,整数>;使用XStream
我正在使用XStream将XML转换为Java映射。每次我解决一个问题,就会遇到另一个问题。令人难以置信的沮丧。无论如何,XML看起来是这样的:将XML转换为Java映射<;字符串,整数>;使用XStream,java,xml,map,xstream,Java,Xml,Map,Xstream,我正在使用XStream将XML转换为Java映射。每次我解决一个问题,就会遇到另一个问题。令人难以置信的沮丧。无论如何,XML看起来是这样的: <?xml version="1.0" encoding="UTF-8" ?> <root> <Durapipe type="int">1</Durapipe> <EXPLAIN type="int">2</EXPLAIN>
<?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>
<Schuster type="int">5</Schuster>
....
</root>
XStream xstream = new XStream();
Map<String, Integer> englishCorpusProbDist;
xstream.registerConverter(new MapEntryConverter());
englishCorpusProbDist = (Map<String, Integer>)xstream.fromXML(new File("locationOnMyComputer/frequencies.xml"));
public class MapEntryConverter implements Converter {
public class java {
}
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(), new Integer(reader.getValue()));
reader.moveUp();
}
return map;
}
}
1.
2.
2.
3.
2.
1.
5.
....
我在main中用于实现此功能的Java如下所示:
<?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>
<Schuster type="int">5</Schuster>
....
</root>
XStream xstream = new XStream();
Map<String, Integer> englishCorpusProbDist;
xstream.registerConverter(new MapEntryConverter());
englishCorpusProbDist = (Map<String, Integer>)xstream.fromXML(new File("locationOnMyComputer/frequencies.xml"));
public class MapEntryConverter implements Converter {
public class java {
}
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(), new Integer(reader.getValue()));
reader.moveUp();
}
return map;
}
}
XStream XStream=newxstream();
地图英文版;
registerConverter(新的MapEntryConverter());
englishCorpusProbDist=(Map)xstream.fromXML(新文件(“locationOnMyComputer/frequencies.xml”);
我创建的MapEntryConverter类如下所示:
<?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>
<Schuster type="int">5</Schuster>
....
</root>
XStream xstream = new XStream();
Map<String, Integer> englishCorpusProbDist;
xstream.registerConverter(new MapEntryConverter());
englishCorpusProbDist = (Map<String, Integer>)xstream.fromXML(new File("locationOnMyComputer/frequencies.xml"));
public class MapEntryConverter implements Converter {
public class java {
}
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(), new Integer(reader.getValue()));
reader.moveUp();
}
return map;
}
}
公共类MapEntryConverter实现转换器{
公共类java{
}
公共布尔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();
}
返回图;
}
}
目前我得到以下异常:“线程中的异常”main“com.thoughtworks.xstream.mapper.CannotResolveClassException:root”
有人能解释一下为什么会这样,我怎样才能解决这个问题吗
这个问题似乎有答案,但我认为我们正在使用不同的实现:
任何帮助都将不胜感激。提前谢谢 试试这个:
XStream xstream = new XStream(new DomDriver());
xstream.alias("root", Map.class);
Map<String, Integer> englishCorpusProbDist;
xstream.registerConverter(new MapEntryConverter());
englishCorpusProbDist = (Map<String, Integer>)xstream.fromXML(new FileInputStream(new File("locationOnMyComputer/frequencies.xml")));
XStream XStream=newxstream(newdomdriver());
别名(“根”,Map.class);
地图英文版;
registerConverter(新的MapEntryConverter());
englishCorpusProbDist=(Map)xstream.fromXML(新文件inputStream(新文件(“locationOnMyComputer/frequencies.xml”));
好的。这似乎效果更好。如果我收到一个异常,它说,“[Fatal Error]frequencies.xml:1:27582:元素类型“key”后面必须跟属性规范“>”或“/>”,这很可能意味着我的xml代码中有错误,对吗?是的,这是xml文件中的错误,可能没有按照xml文件中的预期格式格式化