【问题标题】:Can not convert XML to Map with XStream无法使用 XStream 将 XML 转换为 Map
【发布时间】:2021-10-19 13:15:10
【问题描述】:

我需要将 XML 文件转换为地图。
根据所描述的here,我正在尝试读取一些存储库 XML 文件并将其转换为 Map。
但这给了我

[致命错误] :1:1: prolog 中不允许内容。

错误。
我的 XML 文件的第一行不包含 ? 符号,我已经删除了它们。
我的代码是

static Map<String,Object> 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<String,Object>) 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<String, String> map = new HashMap<String, String>();

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

}

上面的代码实际上是从提到的above问题复制粘贴的。
XML 文件似乎很简单:

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

我完全不熟悉将 XML 转换为 Map,反之亦然。没有使用 Java 处理 XML 文件的经验。
我看到了allthesequestionshere(还有更多),但仍然找不到适合我的解决方案。
我做错了什么?
非常感谢任何帮助!

【问题讨论】:

  • 文件是否通过手动验证?类似xmllint --xpath '//cherryPic' test.xml
  • 我不知道该怎么做...有一些在线资源可以做这个验证吗?
  • 你的操作系统是什么?如果是 Linux,上面的命令应该几乎是开箱即用的。
  • 只是 Windows。 .

标签: java xml xml-parsing xstream


【解决方案1】:

两个修复,fromXML 作为流(不是文字字符串),根是 your 根:

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;

有输出

【讨论】:

  • 完美运行!非常感谢!
猜你喜欢
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多