Java 从属性文件将映射作为键加载

Java 从属性文件将映射作为键加载,java,collections,java-8,Java,Collections,Java 8,如何从属性文件中获取映射作为键并加载到列表中。例如,我想从属性文件创建学生信息的hashmap。属性文件可以是 <map name=student1> <value key=name>abc</value> <value key=age>12</value> <value key=gender>male</value> <map name=student2> <value key=name&g

如何从属性文件中获取映射作为键并加载到列表中。例如,我想从属性文件创建学生信息的hashmap。属性文件可以是

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

... 


abc
12
男性的
xyz
15
女性的
... 

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

如果我正确理解了问题,您希望将XML配置解组到一个映射中,其中用户有任意字段

配置文件缺少映射节点的闭包。 采用以下格式后,您将能够轻松地自动化解码过程:

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

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

这看起来像XML,而不是属性文件。@Holger,我写这些值只是为了理解。我们还可以将属性作为XML传递。如果你有其他方法,欢迎你的建议。感谢重点是,你说“我试图寻找我的解决方案,但没有得到”,但很明显,你搜索了错误的术语。如果要解析XML文件,必须搜索“XML”,而不是“属性文件”。否则,您没有找到匹配的Q&a也就不足为奇了。@holger为什么您认为属性文件不能是xml格式
        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");
    }
property.name=value
other.property.name=value