无法使用XStream将XML转换为Map。

10 浏览
0 Comments

无法使用XStream将XML转换为Map。

我需要将XML文件转换成Map。

根据这里的描述,我正在尝试读取一些存储库XML文件并将其转换为Map。

但是这给了我一个错误消息:

[Fatal Error] :1:1: Content is not allowed in prolog.

我的XML文件在第一行上不包含?符号,我已经将它们移除了。

我的代码是:

static Map repValues;
static String mainRepositoryXML = "common.xml";
static public void setRepValues(){
    String rootPath = Paths.get(".").toAbsolutePath().normalize().toString();
    String path = rootPath + File.separator + "src"+ File.separator + "main" + File.separator + "resources" + File.separator + "repository" + File.separator + mainRepositoryXML;
    XStream xStream = new XStream(new DomDriver());
    xStream.registerConverter(new MapEntryConverter());
    xStream.alias("root", Map.class);
    repValues = (Map) xStream.fromXML(path);
}
public static class MapEntryConverter implements Converter {
    public boolean canConvert(Class clazz) {
        return AbstractMap.class.isAssignableFrom(clazz);
    }
    public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
        AbstractMap map = (AbstractMap) value;
        for (Object obj : map.entrySet()) {
            Map.Entry entry = (Map.Entry) obj;
            writer.startNode(entry.getKey().toString());
            Object val = entry.getValue();
            if ( null != val ) {
                writer.setValue(val.toString());
            }
            writer.endNode();
        }
    }
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        Map map = new HashMap();
        while(reader.hasMoreChildren()) {
            reader.moveDown();
            String key = reader.getNodeName(); // nodeName aka element's name
            String value = reader.getValue();
            map.put(key, value);
            reader.moveUp();
        }
       return map;
    }
}

上面的代码实际上是从上述链接中复制粘贴的。

XML文件似乎非常简单:


    C:\Users\myUserDirectory\Downloads
    /Downloads
    https://www.youtube.com/
    https://www.ebay.com/
    https://proto.gr/sites/www.proto.gr/files/styles/large_retina/public/images/fruits/cherries.jpg
    https://i.pinimg.com/564x/97/86/3e/97863e0a14b69caeea2c92537a81fb1b.jpg
    https://mallofnorway.com/content/uploads/2020/07/008840118.jpg

我对将XML转换为Map和反之的过程完全不熟悉。没有使用Java处理XML文件的经验。

我看到了所有这些 问题 链接 这里(还有更多),但是仍然找不到适合我的解决方案。

我做错了什么?

真的很感谢任何帮助!

0
0 Comments

问题原因:XML与Map之间的转换失败。解决方法:使用流而不是字符串进行XML转换,并确保根元素与实际的根元素匹配。

在使用XStream进行XML转换时,有时会遇到将XML转换为Map时出现"Can not convert XML to Map with XStream"的问题。这个问题的出现原因是XML与Map之间的转换失败。

为了解决这个问题,我们需要进行两个修复操作。首先,我们需要使用流而不是字符串进行XML转换。其次,我们需要确保根元素与实际的根元素匹配。

以下是修复后的代码示例:

XStream xStream = new XStream(new DomDriver());
xStream.registerConverter(new MapEntryConverter());
xStream.alias("general", Map.class);
Object o = xStream.fromXML(new FileInputStream("/home/josejuan/tmp/y.xml"));
repValues = (Map<String,Object>) o;

通过使用流来进行XML转换,我们可以避免将字符串转换为流的问题。同时,通过使用xStream.alias方法,我们可以指定实际的根元素名称,使其与XML中的根元素匹配。

修复后,我们可以看到输出结果如下图所示:

enter image description here

0