【问题标题】:Load map as a key from properties file从属性文件加载地图作为键
【发布时间】:2020-09-02 14:48:54
【问题描述】:

如何从属性文件中获取地图作为键并加载到列表中。例如,我想从属性文件创建学生信息的哈希图。属性文件可以像

<map name=student1>
<value key=name>abc</value>
<value key=age>12</value>
<value key=gender>male</value>

<map name=student2>
<value key=name>xyz</value>
<value key=age>15</value>
<value key=gender>female</value>

... 

我想使用 student1、student2 等键创建所有这些映射的列表。我们如何在简单的 java 8 项目中使用属性文件在一次加载中做到这一点。如果我问任何重复的问题,我很抱歉。我试图寻找我的解决方案,但没有得到它。如果之前回答过同样的问题,请提供链接。

【问题讨论】:

  • 这看起来像 XML,而不是属性文件。
  • @Holger,我写这些值只是为了理解。我们也可以将属性作为 XML 传递。如果您有任何其他方式,欢迎提出建议。谢谢
  • 重点是,您说“我试图搜索我的解决方案,但没有得到它”,但显然,您搜索了错误的术语。如果要解析 XML 文件,则必须搜索“XML”,而不是“属性文件”。否则,您没有找到匹配的问答也就不足为奇了。
  • @holger 为什么你认为属性文件不能是 xml 格式

标签: java collections java-8


【解决方案1】:

如果我正确理解问题,您希望将 XML 配置解组为 Map,其中 User 具有任意字段。

您的配置文件缺少地图节点的关闭。 获得以下格式后,您将能够轻松地自动化解码过程:

<Config>
  <map name="student1">
    <value key="name">abc</value>
    <value key="age">12</value>
    <value key="gender">male</value>
  </map>

  <map name="student2">
    <value key="name">xyz</value>
    <value key="age">15</value>
    <value key="gender">female</value>
  </map>
</Config>

您可以使用 javax.xm.parsers 解决方案创建自定义编组器:

        try {
        final File configFile = Paths.get("C:/Development/file.xml").toFile();
        final DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        final DocumentBuilder dBuilder;

        dBuilder = dbFactory.newDocumentBuilder();

        final Document doc = dBuilder.parse(configFile);

        final NodeList nodeList = doc.getChildNodes();
        if (nodeList.getLength() == 0) {
            throw new IllegalArgumentException("Config is empty or incorrect.");
        }

        final NodeList elements = nodeList.item(0).getChildNodes();

        
        final Map<String, User> users = new HashMap<>();

        for (int i = 0; i < elements.getLength(); i++) {
            final Node item = elements.item(i);
            if (!"map".equals(item.getNodeName())) {
                continue;
            }

            final String key = item.getAttributes().getNamedItem("name").getNodeValue();


            final NodeList childNodes = item.getChildNodes();

            String name;
            String age;
            String gender;

            for (int j = 0; j < childNodes.getLength(); j++) {
                final Node childItem = childNodes.item(j);
                if (!"value".equals(childItem.getNodeName())) {
                    continue;
                }

                final String fieldName = childItem.getAttributes().getNamedItem("key").getNodeValue();
                final String fieldValue = childItem.getNodeValue();
                switch (fieldName) {
                    case "name":
                        name = childItem.getNodeValue();
                        break;
                    case "age":
                        age = childItem.getNodeValue();
                        break;
                    case "gender":
                        gender = childItem.getNodeValue();
                        break;
                    default:
                        throw new IllegalArgumentException(String.format("Unknown user field %s", fieldName));

                }
            }
            
            users.put(key, new User(name, age, gender));
        }
    } catch (final ParserConfigurationException | SAXException | IOException e) {
        throw new IllegalArgumentException("Error during config parsing");
    }

编辑: 由于主帖下的cmets以及我无法在那里写,我将在这里写: 配置属性文件是一种常用的键值对序列化成文件的结构,如下例:

property.name=value
other.property.name=value

XML 文件也是一种数据结构形式,尽管 XML 文件的可能性更广泛,并提供更多的数据灵活性以及对象序列化。您的配置可以存储为属性格式、XML、JSON 等。但是您的数据类型表明使用比属性更复杂的数据存储结构

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 2015-12-15
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多